Module Name: src Committed By: pgoyette Date: Wed Aug 7 00:38:02 UTC 2019
Modified Files: src/sys/dev: ccd.c src/sys/dev/iscsi: iscsi_main.c src/sys/dev/usb: usbnet.c src/sys/kern: kern_module.c sysv_ipc.c sysv_msg.c sysv_sem.c sysv_shm.c src/sys/miscfs/genfs: layer_vfsops.c src/sys/sys: module.h msg.h sem.h shm.h Log Message: Many years ago someone created a new __link_set_sysctl_funcs to hold the list of routines that need to be called for setting up sysctl variables. This worked great for all code included in the kernel itself, but didn't deal with modules that want to create their own sysctl data. So, we ended up with a lot of #ifdef _MODULE blocks so modules could explicitly call their setup functions when loaded as non-built-in modules. So today, we complete the task that was started so many years ago. When modules are loaded, after we've called xxx_modcmd(INIT...) we check if the module contains its own __link_set_sysctl_funcs, and if so we call the functions listed. We add a struct sysctllog member to the struct module so we can call sysctl_teardown() when the module gets unloaded. (The sequence of events ensures that the sysctl stuff doesn't get created until the rest of the module's init code does any required memory allocation.) So, no more need to explicitly call the sysctl setup routines when built as a loadable module. To generate a diff of this commit: cvs rdiff -u -r1.179 -r1.180 src/sys/dev/ccd.c cvs rdiff -u -r1.30 -r1.31 src/sys/dev/iscsi/iscsi_main.c cvs rdiff -u -r1.6 -r1.7 src/sys/dev/usb/usbnet.c cvs rdiff -u -r1.136 -r1.137 src/sys/kern/kern_module.c \ src/sys/kern/sysv_shm.c cvs rdiff -u -r1.39 -r1.40 src/sys/kern/sysv_ipc.c cvs rdiff -u -r1.74 -r1.75 src/sys/kern/sysv_msg.c cvs rdiff -u -r1.97 -r1.98 src/sys/kern/sysv_sem.c cvs rdiff -u -r1.51 -r1.52 src/sys/miscfs/genfs/layer_vfsops.c cvs rdiff -u -r1.46 -r1.47 src/sys/sys/module.h cvs rdiff -u -r1.27 -r1.28 src/sys/sys/msg.h cvs rdiff -u -r1.33 -r1.34 src/sys/sys/sem.h cvs rdiff -u -r1.52 -r1.53 src/sys/sys/shm.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/ccd.c diff -u src/sys/dev/ccd.c:1.179 src/sys/dev/ccd.c:1.180 --- src/sys/dev/ccd.c:1.179 Wed Mar 27 19:13:34 2019 +++ src/sys/dev/ccd.c Wed Aug 7 00:38:01 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ccd.c,v 1.179 2019/03/27 19:13:34 martin Exp $ */ +/* $NetBSD: ccd.c,v 1.180 2019/08/07 00:38:01 pgoyette Exp $ */ /*- * Copyright (c) 1996, 1997, 1998, 1999, 2007, 2009 The NetBSD Foundation, Inc. @@ -88,7 +88,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ccd.c,v 1.179 2019/03/27 19:13:34 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ccd.c,v 1.180 2019/08/07 00:38:01 pgoyette Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -216,10 +216,6 @@ static void printiinfo(struct ccdiinfo * static LIST_HEAD(, ccd_softc) ccds = LIST_HEAD_INITIALIZER(ccds); static kmutex_t ccd_lock; -#ifdef _MODULE -static struct sysctllog *ccd_clog; -#endif - SYSCTL_SETUP_PROTO(sysctl_kern_ccd_setup); static struct ccd_softc * @@ -1681,7 +1677,6 @@ ccd_modcmd(modcmd_t cmd, void *arg) error = devsw_attach("ccd", &ccd_bdevsw, &bmajor, &ccd_cdevsw, &cmajor); - sysctl_kern_ccd_setup(&ccd_clog); #endif break; @@ -1696,7 +1691,6 @@ ccd_modcmd(modcmd_t cmd, void *arg) error = devsw_detach(&ccd_bdevsw, &ccd_cdevsw); ccddetach(); } - sysctl_teardown(&ccd_clog); #endif break; Index: src/sys/dev/iscsi/iscsi_main.c diff -u src/sys/dev/iscsi/iscsi_main.c:1.30 src/sys/dev/iscsi/iscsi_main.c:1.31 --- src/sys/dev/iscsi/iscsi_main.c:1.30 Sat Jul 13 17:06:00 2019 +++ src/sys/dev/iscsi/iscsi_main.c Wed Aug 7 00:38:02 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: iscsi_main.c,v 1.30 2019/07/13 17:06:00 mlelstv Exp $ */ +/* $NetBSD: iscsi_main.c,v 1.31 2019/08/07 00:38:02 pgoyette Exp $ */ /*- * Copyright (c) 2004,2005,2006,2011 The NetBSD Foundation, Inc. @@ -677,7 +677,6 @@ iscsi_modcmd(modcmd_t cmd, void *arg) #ifdef _MODULE devmajor_t cmajor = NODEVMAJOR, bmajor = NODEVMAJOR; int error; - static struct sysctllog *clog; #endif switch (cmd) { @@ -723,8 +722,6 @@ iscsi_modcmd(modcmd_t cmd, void *arg) config_cfdriver_detach(&iscsi_cd); return ENXIO; } - - sysctl_iscsi_setup(&clog); #endif return 0; break; @@ -735,8 +732,6 @@ iscsi_modcmd(modcmd_t cmd, void *arg) if (error) return error; - sysctl_teardown(&clog); - config_cfattach_detach(iscsi_cd.cd_name, &iscsi_ca); config_cfdriver_detach(&iscsi_cd); devsw_detach(NULL, &iscsi_cdevsw); Index: src/sys/dev/usb/usbnet.c diff -u src/sys/dev/usb/usbnet.c:1.6 src/sys/dev/usb/usbnet.c:1.7 --- src/sys/dev/usb/usbnet.c:1.6 Tue Aug 6 01:42:22 2019 +++ src/sys/dev/usb/usbnet.c Wed Aug 7 00:38:02 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: usbnet.c,v 1.6 2019/08/06 01:42:22 mrg Exp $ */ +/* $NetBSD: usbnet.c,v 1.7 2019/08/07 00:38:02 pgoyette Exp $ */ /* * Copyright (c) 2019 Matthew R. Green @@ -33,7 +33,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: usbnet.c,v 1.6 2019/08/06 01:42:22 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: usbnet.c,v 1.7 2019/08/07 00:38:02 pgoyette Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -1207,18 +1207,8 @@ usbnet_modcmd(modcmd_t cmd, void *arg) { switch (cmd) { case MODULE_CMD_INIT: -#ifdef _MODULE -# if defined(USB_DEBUG) && defined(USBNET_DEBUG) - sysctl_hw_usbnet_setup(&usbnet_clog); -# endif -#endif return 0; case MODULE_CMD_FINI: -#ifdef _MODULE -# if defined(USB_DEBUG) && defined(USBNET_DEBUG) - sysctl_teardown(&usbnet_clog); -# endif -#endif return 0; case MODULE_CMD_STAT: case MODULE_CMD_AUTOUNLOAD: Index: src/sys/kern/kern_module.c diff -u src/sys/kern/kern_module.c:1.136 src/sys/kern/kern_module.c:1.137 --- src/sys/kern/kern_module.c:1.136 Wed Jun 19 15:01:01 2019 +++ src/sys/kern/kern_module.c Wed Aug 7 00:38:02 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_module.c,v 1.136 2019/06/19 15:01:01 pgoyette Exp $ */ +/* $NetBSD: kern_module.c,v 1.137 2019/08/07 00:38:02 pgoyette Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_module.c,v 1.136 2019/06/19 15:01:01 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_module.c,v 1.137 2019/08/07 00:38:02 pgoyette Exp $"); #define _MODULE_INTERNAL @@ -947,6 +947,35 @@ module_do_builtin(const module_t *pmod, } /* + * module_load_sysctl + * + * Check to see if the module has any SYSCTL_SETUP() routine(s) + * registered. If so, call it (them). + */ + +static void +module_load_sysctl(module_t *mod) +{ + void (**ls_funcp)(struct sysctllog **); + void *ls_start; + size_t ls_size, count; + int error; + + error = kobj_find_section(mod->mod_kobj, "link_set_sysctl_funcs", + &ls_start, &ls_size); + if (error == 0) { + count = ls_size / sizeof(ls_start); + ls_funcp = ls_start; + while (count--) { + (**ls_funcp)(&mod->mod_sysctllog); + ls_funcp++; + } + } + else + error = 0; /* no setup funcs registered */ +} + +/* * module_do_load: * * Helper routine: load a module from the file system, or one @@ -1265,6 +1294,8 @@ module_do_load(const char *name, bool is goto fail1; } + module_load_sysctl(mod); /* Set-up module's sysctl if any */ + /* * Good, the module loaded successfully. Put it onto the * list and add references to its requisite modules. @@ -1344,9 +1375,18 @@ module_do_unload(const char *name, bool prev_active = module_active; module_active = mod; module_callback_unload(mod); + + /* + * If there were any registered SYSCTL_SETUP funcs, make sure + * we release the sysctl entries + */ + if (mod->mod_sysctllog) { + sysctl_teardown(&mod->mod_sysctllog); + } error = (*mod->mod_info->mi_modcmd)(MODULE_CMD_FINI, NULL); module_active = prev_active; if (error != 0) { + module_load_sysctl(mod); /* re-enable sysctl stuff */ module_print("cannot unload module `%s' error=%d", name, error); return error; Index: src/sys/kern/sysv_shm.c diff -u src/sys/kern/sysv_shm.c:1.136 src/sys/kern/sysv_shm.c:1.137 --- src/sys/kern/sysv_shm.c:1.136 Tue Aug 6 15:48:06 2019 +++ src/sys/kern/sysv_shm.c Wed Aug 7 00:38:02 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sysv_shm.c,v 1.136 2019/08/06 15:48:06 riastradh Exp $ */ +/* $NetBSD: sysv_shm.c,v 1.137 2019/08/07 00:38:02 pgoyette Exp $ */ /*- * Copyright (c) 1999, 2007 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sysv_shm.c,v 1.136 2019/08/06 15:48:06 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysv_shm.c,v 1.137 2019/08/07 00:38:02 pgoyette Exp $"); #ifdef _KERNEL_OPT #include "opt_sysv.h" @@ -933,7 +933,7 @@ shmrealloc(int newshmni) } int -shminit(struct sysctllog **clog) +shminit(void) { vaddr_t v; size_t sz; @@ -978,10 +978,6 @@ shminit(struct sysctllog **clog) uvm_shmexit = shmexit; uvm_shmfork = shmfork; -#ifdef _MODULE - if (clog) - sysctl_ipc_shm_setup(clog); -#endif return 0; } Index: src/sys/kern/sysv_ipc.c diff -u src/sys/kern/sysv_ipc.c:1.39 src/sys/kern/sysv_ipc.c:1.40 --- src/sys/kern/sysv_ipc.c:1.39 Wed Apr 10 10:03:50 2019 +++ src/sys/kern/sysv_ipc.c Wed Aug 7 00:38:02 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sysv_ipc.c,v 1.39 2019/04/10 10:03:50 pgoyette Exp $ */ +/* $NetBSD: sysv_ipc.c,v 1.40 2019/08/07 00:38:02 pgoyette Exp $ */ /*- * Copyright (c) 1998, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sysv_ipc.c,v 1.39 2019/04/10 10:03:50 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysv_ipc.c,v 1.40 2019/08/07 00:38:02 pgoyette Exp $"); #ifdef _KERNEL_OPT #include "opt_sysv.h" @@ -132,8 +132,6 @@ MODULE(MODULE_CLASS_EXEC, sysv_ipc, NULL SYSCTL_SETUP_PROTO(sysctl_ipc_setup); -static struct sysctllog *sysctl_sysvipc_clog = NULL; - static const struct syscall_package sysvipc_syscalls[] = { #if defined(SYSVSHM) { SYS___shmctl50, 0, (sy_call_t *)sys___shmctl50 }, @@ -180,12 +178,12 @@ sysv_ipc_modcmd(modcmd_t cmd, void *arg) * sysctl data */ #ifdef SYSVSHM - error = shminit(&sysctl_sysvipc_clog); + error = shminit(); if (error != 0) return error; #endif #ifdef SYSVSEM - error = seminit(&sysctl_sysvipc_clog); + error = seminit(); if (error != 0) { #ifdef SYSVSHM shmfini(); @@ -194,7 +192,7 @@ sysv_ipc_modcmd(modcmd_t cmd, void *arg) } #endif #ifdef SYSVMSG - error = msginit(&sysctl_sysvipc_clog); + error = msginit(); if (error != 0) { #ifdef SYSVSEM semfini(); @@ -205,11 +203,6 @@ sysv_ipc_modcmd(modcmd_t cmd, void *arg) return error; } #endif - -#ifdef _MODULE - /* Set up the common sysctl tree */ - sysctl_ipc_setup(&sysctl_sysvipc_clog); -#endif break; case MODULE_CMD_FINI: /* @@ -228,7 +221,7 @@ sysv_ipc_modcmd(modcmd_t cmd, void *arg) #ifdef SYSVSEM if (semfini()) { #ifdef SYSVSHM - shminit(NULL); + shminit(); #endif return EBUSY; } @@ -236,20 +229,14 @@ sysv_ipc_modcmd(modcmd_t cmd, void *arg) #ifdef SYSVMSG if (msgfini()) { #ifdef SYSVSEM - seminit(NULL); + seminit(); #endif #ifdef SYSVSHM - shminit(NULL); + shminit(); #endif return EBUSY; } #endif - -#ifdef _MODULE - /* Remove the sysctl sub-trees */ - sysctl_teardown(&sysctl_sysvipc_clog); -#endif - /* Unlink the system calls. */ error = syscall_disestablish(NULL, sysvipc_syscalls); if (error) Index: src/sys/kern/sysv_msg.c diff -u src/sys/kern/sysv_msg.c:1.74 src/sys/kern/sysv_msg.c:1.75 --- src/sys/kern/sysv_msg.c:1.74 Wed Apr 10 10:03:50 2019 +++ src/sys/kern/sysv_msg.c Wed Aug 7 00:38:02 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sysv_msg.c,v 1.74 2019/04/10 10:03:50 pgoyette Exp $ */ +/* $NetBSD: sysv_msg.c,v 1.75 2019/08/07 00:38:02 pgoyette Exp $ */ /*- * Copyright (c) 1999, 2006, 2007 The NetBSD Foundation, Inc. @@ -50,7 +50,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sysv_msg.c,v 1.74 2019/04/10 10:03:50 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysv_msg.c,v 1.75 2019/08/07 00:38:02 pgoyette Exp $"); #ifdef _KERNEL_OPT #include "opt_sysv.h" @@ -94,7 +94,7 @@ extern int kern_has_sysvmsg; SYSCTL_SETUP_PROTO(sysctl_ipc_msg_setup); int -msginit(struct sysctllog **clog) +msginit(void) { int i, sz; vaddr_t v; @@ -167,10 +167,6 @@ msginit(struct sysctllog **clog) kern_has_sysvmsg = 1; -#ifdef _MODULE - if (clog) - sysctl_ipc_msg_setup(clog); -#endif return 0; } Index: src/sys/kern/sysv_sem.c diff -u src/sys/kern/sysv_sem.c:1.97 src/sys/kern/sysv_sem.c:1.98 --- src/sys/kern/sysv_sem.c:1.97 Wed Apr 10 10:03:50 2019 +++ src/sys/kern/sysv_sem.c Wed Aug 7 00:38:02 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sysv_sem.c,v 1.97 2019/04/10 10:03:50 pgoyette Exp $ */ +/* $NetBSD: sysv_sem.c,v 1.98 2019/08/07 00:38:02 pgoyette Exp $ */ /*- * Copyright (c) 1999, 2007 The NetBSD Foundation, Inc. @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sysv_sem.c,v 1.97 2019/04/10 10:03:50 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysv_sem.c,v 1.98 2019/08/07 00:38:02 pgoyette Exp $"); #ifdef _KERNEL_OPT #include "opt_sysv.h" @@ -102,7 +102,7 @@ static ONCE_DECL(exithook_control); static int seminit_exithook(void); int -seminit(struct sysctllog **clog) +seminit(void) { int i, sz; vaddr_t v; @@ -145,10 +145,6 @@ seminit(struct sysctllog **clog) kern_has_sysvsem = 1; -#ifdef _MODULE - if (clog) - sysctl_ipc_sem_setup(clog); -#endif return 0; } Index: src/sys/miscfs/genfs/layer_vfsops.c diff -u src/sys/miscfs/genfs/layer_vfsops.c:1.51 src/sys/miscfs/genfs/layer_vfsops.c:1.52 --- src/sys/miscfs/genfs/layer_vfsops.c:1.51 Sun Jun 4 08:02:26 2017 +++ src/sys/miscfs/genfs/layer_vfsops.c Wed Aug 7 00:38:02 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: layer_vfsops.c,v 1.51 2017/06/04 08:02:26 hannken Exp $ */ +/* $NetBSD: layer_vfsops.c,v 1.52 2019/08/07 00:38:02 pgoyette Exp $ */ /* * Copyright (c) 1999 National Aeronautics & Space Administration @@ -74,7 +74,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: layer_vfsops.c,v 1.51 2017/06/04 08:02:26 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: layer_vfsops.c,v 1.52 2019/08/07 00:38:02 pgoyette Exp $"); #include <sys/param.h> #include <sys/sysctl.h> @@ -97,20 +97,11 @@ MODULE(MODULE_CLASS_MISC, layerfs, NULL) static int layerfs_modcmd(modcmd_t cmd, void *arg) { -#ifdef _MODULE - static struct sysctllog *layerfs_clog = NULL; -#endif switch (cmd) { case MODULE_CMD_INIT: -#ifdef _MODULE - sysctl_vfs_layerfs_setup(&layerfs_clog); -#endif return 0; case MODULE_CMD_FINI: -#ifdef _MODULE - sysctl_teardown(&layerfs_clog); -#endif return 0; default: return ENOTTY; Index: src/sys/sys/module.h diff -u src/sys/sys/module.h:1.46 src/sys/sys/module.h:1.47 --- src/sys/sys/module.h:1.46 Mon Apr 8 11:32:49 2019 +++ src/sys/sys/module.h Wed Aug 7 00:38:02 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: module.h,v 1.46 2019/04/08 11:32:49 pgoyette Exp $ */ +/* $NetBSD: module.h,v 1.47 2019/08/07 00:38:02 pgoyette Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -83,6 +83,9 @@ typedef struct modinfo { } const modinfo_t; /* Per module information, maintained by kern_module.c */ + +struct sysctllog; + typedef struct module { u_int mod_refcnt; int mod_flags; @@ -97,6 +100,7 @@ typedef struct module { modsrc_t mod_source; time_t mod_autotime; specificdata_reference mod_sdref; + struct sysctllog *mod_sysctllog; } module_t; /* Index: src/sys/sys/msg.h diff -u src/sys/sys/msg.h:1.27 src/sys/sys/msg.h:1.28 --- src/sys/sys/msg.h:1.27 Wed Apr 10 10:03:50 2019 +++ src/sys/sys/msg.h Wed Aug 7 00:38:02 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: msg.h,v 1.27 2019/04/10 10:03:50 pgoyette Exp $ */ +/* $NetBSD: msg.h,v 1.28 2019/08/07 00:38:02 pgoyette Exp $ */ /*- * Copyright (c) 1999, 2007 The NetBSD Foundation, Inc. @@ -209,7 +209,7 @@ __END_DECLS struct proc; -int msginit(struct sysctllog **); +int msginit(void); int msgfini(void); int msgctl1(struct lwp *, int, int, struct msqid_ds *); int msgsnd1(struct lwp *, int, const char *, size_t, int, size_t, Index: src/sys/sys/sem.h diff -u src/sys/sys/sem.h:1.33 src/sys/sys/sem.h:1.34 --- src/sys/sys/sem.h:1.33 Wed Apr 10 10:03:50 2019 +++ src/sys/sys/sem.h Wed Aug 7 00:38:02 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sem.h,v 1.33 2019/04/10 10:03:50 pgoyette Exp $ */ +/* $NetBSD: sem.h,v 1.34 2019/08/07 00:38:02 pgoyette Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -222,7 +222,7 @@ int semconfig(int); #endif __END_DECLS #else -int seminit(struct sysctllog **); +int seminit(void); int semfini(void); void semexit(struct proc *, void *); Index: src/sys/sys/shm.h diff -u src/sys/sys/shm.h:1.52 src/sys/sys/shm.h:1.53 --- src/sys/sys/shm.h:1.52 Wed Apr 10 10:03:50 2019 +++ src/sys/sys/shm.h Wed Aug 7 00:38:02 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: shm.h,v 1.52 2019/04/10 10:03:50 pgoyette Exp $ */ +/* $NetBSD: shm.h,v 1.53 2019/08/07 00:38:02 pgoyette Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -172,7 +172,7 @@ extern int shm_nused; struct vmspace; -int shminit(struct sysctllog **); +int shminit(void); int shmfini(void); void shmfork(struct vmspace *, struct vmspace *); void shmexit(struct vmspace *);