From owner-svn-src-all@freebsd.org Mon Dec 16 03:12:54 2019 Return-Path: Delivered-To: svn-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 8EAB41D6C70; Mon, 16 Dec 2019 03:12:54 +0000 (UTC) (envelope-from kevans@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 47bmYL21lkz4H28; Mon, 16 Dec 2019 03:12:54 +0000 (UTC) (envelope-from kevans@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 40AF61F152; Mon, 16 Dec 2019 03:12:54 +0000 (UTC) (envelope-from kevans@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id xBG3Csld044705; Mon, 16 Dec 2019 03:12:54 GMT (envelope-from kevans@FreeBSD.org) Received: (from kevans@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id xBG3Crw0044702; Mon, 16 Dec 2019 03:12:53 GMT (envelope-from kevans@FreeBSD.org) Message-Id: <201912160312.xBG3Crw0044702@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kevans set sender to kevans@FreeBSD.org using -f From: Kyle Evans Date: Mon, 16 Dec 2019 03:12:53 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r355798 - in head/sys: dev/kbd sys X-SVN-Group: head X-SVN-Commit-Author: kevans X-SVN-Commit-Paths: in head/sys: dev/kbd sys X-SVN-Commit-Revision: 355798 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 16 Dec 2019 03:12:54 -0000 Author: kevans Date: Mon Dec 16 03:12:53 2019 New Revision: 355798 URL: https://svnweb.freebsd.org/changeset/base/355798 Log: kbd: remove kbdsw, store pointer to driver in each keyboard_t The previous implementation relied on a kbdsw array that mirrored the global keyboards array. This is fine, but also requires extra locking consideration when accessing to ensure that it's not being resized as new keyboards are added. The extra pointer costs little in a struct that there are relatively few of on any given system, and simplifies locking requirements ever-so-slightly as we only need to consider the locking requirements of whichever method is being invoked. __FreeBSD_version is bumped as any kbd modules will need rebuilt following this change. Modified: head/sys/dev/kbd/kbd.c head/sys/dev/kbd/kbdreg.h head/sys/sys/param.h Modified: head/sys/dev/kbd/kbd.c ============================================================================== --- head/sys/dev/kbd/kbd.c Mon Dec 16 03:05:35 2019 (r355797) +++ head/sys/dev/kbd/kbd.c Mon Dec 16 03:12:53 2019 (r355798) @@ -83,8 +83,6 @@ SET_DECLARE(kbddriver_set, const keyboard_driver_t); static int keyboards = 1; static keyboard_t *kbd_ini; static keyboard_t **keyboard = &kbd_ini; -static keyboard_switch_t *kbdsw_ini; - keyboard_switch_t **kbdsw = &kbdsw_ini; static int keymap_restrict_change; static SYSCTL_NODE(_hw, OID_AUTO, kbd, CTLFLAG_RD, 0, "kbd"); @@ -97,7 +95,6 @@ static int kbd_realloc_array(void) { keyboard_t **new_kbd; - keyboard_switch_t **new_kbdsw; int newsize; int s; @@ -108,21 +105,10 @@ kbd_realloc_array(void) splx(s); return (ENOMEM); } - new_kbdsw = malloc(sizeof(*new_kbdsw)*newsize, M_DEVBUF, - M_NOWAIT|M_ZERO); - if (new_kbdsw == NULL) { - free(new_kbd, M_DEVBUF); - splx(s); - return (ENOMEM); - } bcopy(keyboard, new_kbd, sizeof(*keyboard)*keyboards); - bcopy(kbdsw, new_kbdsw, sizeof(*kbdsw)*keyboards); - if (keyboards > 1) { + if (keyboards > 1) free(keyboard, M_DEVBUF); - free(kbdsw, M_DEVBUF); - } keyboard = new_kbd; - kbdsw = new_kbdsw; keyboards = newsize; splx(s); @@ -226,8 +212,8 @@ kbd_register(keyboard_t *kbd) SLIST_FOREACH(p, &keyboard_drivers, link) { if (strcmp(p->name, kbd->kb_name) == 0) { + kbd->kb_drv = p; keyboard[index] = kbd; - kbdsw[index] = p->kbdsw; if (mux != NULL) { bzero(&ki, sizeof(ki)); @@ -243,8 +229,8 @@ kbd_register(keyboard_t *kbd) SET_FOREACH(list, kbddriver_set) { p = *list; if (strcmp(p->name, kbd->kb_name) == 0) { + kbd->kb_drv = p; keyboard[index] = kbd; - kbdsw[index] = p->kbdsw; if (mux != NULL) { bzero(&ki, sizeof(ki)); @@ -287,7 +273,6 @@ kbd_unregister(keyboard_t *kbd) } KBD_INVALID(kbd); keyboard[kbd->kb_index] = NULL; - kbdsw[kbd->kb_index] = NULL; splx(s); return (0); Modified: head/sys/dev/kbd/kbdreg.h ============================================================================== --- head/sys/dev/kbd/kbdreg.h Mon Dec 16 03:05:35 2019 (r355797) +++ head/sys/dev/kbd/kbdreg.h Mon Dec 16 03:12:53 2019 (r355798) @@ -41,6 +41,30 @@ struct cdevsw; /* call back funcion */ typedef int kbd_callback_func_t(keyboard_t *kbd, int event, void *arg); + +/* keyboard function table */ +typedef int kbd_probe_t(int unit, void *arg, int flags); +typedef int kbd_init_t(int unit, keyboard_t **kbdp, void *arg, + int flags); +typedef int kbd_term_t(keyboard_t *kbd); +typedef int kbd_intr_t(keyboard_t *kbd, void *arg); +typedef int kbd_test_if_t(keyboard_t *kbd); +typedef int kbd_enable_t(keyboard_t *kbd); +typedef int kbd_disable_t(keyboard_t *kbd); +typedef int kbd_read_t(keyboard_t *kbd, int wait); +typedef int kbd_check_t(keyboard_t *kbd); +typedef u_int kbd_read_char_t(keyboard_t *kbd, int wait); +typedef int kbd_check_char_t(keyboard_t *kbd); +typedef int kbd_ioctl_t(keyboard_t *kbd, u_long cmd, caddr_t data); +typedef int kbd_lock_t(keyboard_t *kbd, int lock); +typedef void kbd_clear_state_t(keyboard_t *kbd); +typedef int kbd_get_state_t(keyboard_t *kbd, void *buf, size_t len); +typedef int kbd_set_state_t(keyboard_t *kbd, void *buf, size_t len); +typedef u_char *kbd_get_fkeystr_t(keyboard_t *kbd, int fkey, + size_t *len); +typedef int kbd_poll_mode_t(keyboard_t *kbd, int on); +typedef void kbd_diag_t(keyboard_t *kbd, int level); + /* event types */ #define KBDIO_KEYINPUT 0 #define KBDIO_UNLOADING 1 @@ -50,6 +74,36 @@ typedef struct keyboard_callback { void *kc_arg; } keyboard_callback_t; +typedef struct keyboard_switch { + kbd_probe_t *probe; + kbd_init_t *init; + kbd_term_t *term; + kbd_intr_t *intr; + kbd_test_if_t *test_if; + kbd_enable_t *enable; + kbd_disable_t *disable; + kbd_read_t *read; + kbd_check_t *check; + kbd_read_char_t *read_char; + kbd_check_char_t *check_char; + kbd_ioctl_t *ioctl; + kbd_lock_t *lock; + kbd_clear_state_t *clear_state; + kbd_get_state_t *get_state; + kbd_set_state_t *set_state; + kbd_get_fkeystr_t *get_fkeystr; + kbd_poll_mode_t *poll; + kbd_diag_t *diag; +} keyboard_switch_t; + +/* keyboard driver */ +typedef struct keyboard_driver { + SLIST_ENTRY(keyboard_driver) link; + char *name; + keyboard_switch_t *kbdsw; + int (*configure)(int); /* backdoor for the console driver */ +} keyboard_driver_t; + /* keyboard */ struct keyboard { /* the following fields are managed by kbdio */ @@ -94,6 +148,7 @@ struct keyboard { unsigned long kb_count; /* # of processed key strokes */ u_char kb_lastact[NUM_KEYS/2]; struct cdev *kb_dev; + const keyboard_driver_t *kb_drv; }; #define KBD_IS_VALID(k) ((k)->kb_flags & KB_VALID) @@ -118,61 +173,6 @@ struct keyboard { #define KBD_DEACTIVATE(k) (--(k)->kb_active) #define KBD_LED_VAL(k) ((k)->kb_led) -/* keyboard function table */ -typedef int kbd_probe_t(int unit, void *arg, int flags); -typedef int kbd_init_t(int unit, keyboard_t **kbdp, void *arg, - int flags); -typedef int kbd_term_t(keyboard_t *kbd); -typedef int kbd_intr_t(keyboard_t *kbd, void *arg); -typedef int kbd_test_if_t(keyboard_t *kbd); -typedef int kbd_enable_t(keyboard_t *kbd); -typedef int kbd_disable_t(keyboard_t *kbd); -typedef int kbd_read_t(keyboard_t *kbd, int wait); -typedef int kbd_check_t(keyboard_t *kbd); -typedef u_int kbd_read_char_t(keyboard_t *kbd, int wait); -typedef int kbd_check_char_t(keyboard_t *kbd); -typedef int kbd_ioctl_t(keyboard_t *kbd, u_long cmd, caddr_t data); -typedef int kbd_lock_t(keyboard_t *kbd, int lock); -typedef void kbd_clear_state_t(keyboard_t *kbd); -typedef int kbd_get_state_t(keyboard_t *kbd, void *buf, size_t len); -typedef int kbd_set_state_t(keyboard_t *kbd, void *buf, size_t len); -typedef u_char *kbd_get_fkeystr_t(keyboard_t *kbd, int fkey, - size_t *len); -typedef int kbd_poll_mode_t(keyboard_t *kbd, int on); -typedef void kbd_diag_t(keyboard_t *kbd, int level); - -typedef struct keyboard_switch { - kbd_probe_t *probe; - kbd_init_t *init; - kbd_term_t *term; - kbd_intr_t *intr; - kbd_test_if_t *test_if; - kbd_enable_t *enable; - kbd_disable_t *disable; - kbd_read_t *read; - kbd_check_t *check; - kbd_read_char_t *read_char; - kbd_check_char_t *check_char; - kbd_ioctl_t *ioctl; - kbd_lock_t *lock; - kbd_clear_state_t *clear_state; - kbd_get_state_t *get_state; - kbd_set_state_t *set_state; - kbd_get_fkeystr_t *get_fkeystr; - kbd_poll_mode_t *poll; - kbd_diag_t *diag; -} keyboard_switch_t; - -/* keyboard driver */ -typedef struct keyboard_driver { - SLIST_ENTRY(keyboard_driver) link; - char *name; - keyboard_switch_t *kbdsw; - int (*configure)(int); /* backdoor for the console driver */ -} keyboard_driver_t; - -extern keyboard_switch_t **kbdsw; - /* * Keyboard disciplines: call actual handlers via kbdsw[]. */ @@ -180,77 +180,77 @@ static __inline int kbdd_probe(keyboard_t *kbd, int unit, void *arg, int flags) { - return ((*kbdsw[kbd->kb_index]->probe)(unit, arg, flags)); + return ((*kbd->kb_drv->kbdsw->probe)(unit, arg, flags)); } static __inline int kbdd_init(keyboard_t *kbd, int unit, keyboard_t **kbdpp, void *arg, int flags) { - return ((*kbdsw[kbd->kb_index]->init)(unit, kbdpp, arg, flags)); + return ((*kbd->kb_drv->kbdsw->init)(unit, kbdpp, arg, flags)); } static __inline int kbdd_term(keyboard_t *kbd) { - return ((*kbdsw[kbd->kb_index]->term)(kbd)); + return ((*kbd->kb_drv->kbdsw->term)(kbd)); } static __inline int kbdd_intr(keyboard_t *kbd, void *arg) { - return ((*kbdsw[kbd->kb_index]->intr)(kbd, arg)); + return ((*kbd->kb_drv->kbdsw->intr)(kbd, arg)); } static __inline int kbdd_test_if(keyboard_t *kbd) { - return ((*kbdsw[kbd->kb_index]->test_if)(kbd)); + return ((*kbd->kb_drv->kbdsw->test_if)(kbd)); } static __inline int kbdd_enable(keyboard_t *kbd) { - return ((*kbdsw[kbd->kb_index]->enable)(kbd)); + return ((*kbd->kb_drv->kbdsw->enable)(kbd)); } static __inline int kbdd_disable(keyboard_t *kbd) { - return ((*kbdsw[kbd->kb_index]->disable)(kbd)); + return ((*kbd->kb_drv->kbdsw->disable)(kbd)); } static __inline int kbdd_read(keyboard_t *kbd, int wait) { - return ((*kbdsw[kbd->kb_index]->read)(kbd, wait)); + return ((*kbd->kb_drv->kbdsw->read)(kbd, wait)); } static __inline int kbdd_check(keyboard_t *kbd) { - return ((*kbdsw[kbd->kb_index]->check)(kbd)); + return ((*kbd->kb_drv->kbdsw->check)(kbd)); } static __inline u_int kbdd_read_char(keyboard_t *kbd, int wait) { - return ((*kbdsw[kbd->kb_index]->read_char)(kbd, wait)); + return ((*kbd->kb_drv->kbdsw->read_char)(kbd, wait)); } static __inline int kbdd_check_char(keyboard_t *kbd) { - return ((*kbdsw[kbd->kb_index]->check_char)(kbd)); + return ((*kbd->kb_drv->kbdsw->check_char)(kbd)); } static __inline int @@ -259,56 +259,56 @@ kbdd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t data) if (kbd == NULL) return (ENODEV); - return ((*kbdsw[kbd->kb_index]->ioctl)(kbd, cmd, data)); + return ((*kbd->kb_drv->kbdsw->ioctl)(kbd, cmd, data)); } static __inline int kbdd_lock(keyboard_t *kbd, int lock) { - return ((*kbdsw[kbd->kb_index]->lock)(kbd, lock)); + return ((*kbd->kb_drv->kbdsw->lock)(kbd, lock)); } static __inline void kbdd_clear_state(keyboard_t *kbd) { - (*kbdsw[kbd->kb_index]->clear_state)(kbd); + (*kbd->kb_drv->kbdsw->clear_state)(kbd); } static __inline int kbdd_get_state(keyboard_t *kbd, void *buf, int len) { - return ((*kbdsw[kbd->kb_index]->get_state)(kbd, buf, len)); + return ((*kbd->kb_drv->kbdsw->get_state)(kbd, buf, len)); } static __inline int kbdd_set_state(keyboard_t *kbd, void *buf, int len) { - return ((*kbdsw[kbd->kb_index]->set_state)(kbd, buf, len)); + return ((*kbd->kb_drv->kbdsw->set_state)(kbd, buf, len)); } static __inline u_char * kbdd_get_fkeystr(keyboard_t *kbd, int fkey, size_t *len) { - return ((*kbdsw[kbd->kb_index]->get_fkeystr)(kbd, fkey, len)); + return ((*kbd->kb_drv->kbdsw->get_fkeystr)(kbd, fkey, len)); } static __inline int kbdd_poll(keyboard_t *kbd, int on) { - return ((*kbdsw[kbd->kb_index]->poll)(kbd, on)); + return ((*kbd->kb_drv->kbdsw->poll)(kbd, on)); } static __inline void kbdd_diag(keyboard_t *kbd, int level) { - (*kbdsw[kbd->kb_index]->diag)(kbd, level); + (*kbd->kb_drv->kbdsw->diag)(kbd, level); } #define KEYBOARD_DRIVER(name, sw, config) \ Modified: head/sys/sys/param.h ============================================================================== --- head/sys/sys/param.h Mon Dec 16 03:05:35 2019 (r355797) +++ head/sys/sys/param.h Mon Dec 16 03:12:53 2019 (r355798) @@ -60,7 +60,7 @@ * in the range 5 to 9. */ #undef __FreeBSD_version -#define __FreeBSD_version 1300067 /* Master, propagated to newvers */ +#define __FreeBSD_version 1300068 /* Master, propagated to newvers */ /* * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,