Module Name: src Committed By: pgoyette Date: Mon Dec 7 11:38:46 UTC 2015
Modified Files: src/distrib/sets/lists/modules: mi src/sys/kern: init_main.c kern_drvctl.c subr_autoconf.c src/sys/modules: Makefile src/sys/sys: device.h devmon.h Added Files: src/sys/modules/drvctl: Makefile drvctl.ioconf Log Message: Modularize drvctl(4) To generate a diff of this commit: cvs rdiff -u -r1.81 -r1.82 src/distrib/sets/lists/modules/mi cvs rdiff -u -r1.475 -r1.476 src/sys/kern/init_main.c cvs rdiff -u -r1.39 -r1.40 src/sys/kern/kern_drvctl.c cvs rdiff -u -r1.236 -r1.237 src/sys/kern/subr_autoconf.c cvs rdiff -u -r1.163 -r1.164 src/sys/modules/Makefile cvs rdiff -u -r0 -r1.1 src/sys/modules/drvctl/Makefile \ src/sys/modules/drvctl/drvctl.ioconf cvs rdiff -u -r1.147 -r1.148 src/sys/sys/device.h cvs rdiff -u -r1.1 -r1.2 src/sys/sys/devmon.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/distrib/sets/lists/modules/mi diff -u src/distrib/sets/lists/modules/mi:1.81 src/distrib/sets/lists/modules/mi:1.82 --- src/distrib/sets/lists/modules/mi:1.81 Mon Dec 7 03:25:57 2015 +++ src/distrib/sets/lists/modules/mi Mon Dec 7 11:38:46 2015 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.81 2015/12/07 03:25:57 pgoyette Exp $ +# $NetBSD: mi,v 1.82 2015/12/07 11:38:46 pgoyette Exp $ # # Note: don't delete entries from here - mark them as "obsolete" instead. # @@ -62,6 +62,8 @@ ./@MODULEDIR@/dk_subr/dk_subr.kmod base-kernel-modules kmod ./@MODULEDIR@/dm base-kernel-modules lvm,kmod ./@MODULEDIR@/dm/dm.kmod base-kernel-modules lvm,kmod +./@MODULEDIR@/drvctl base-kernel-modules lvm,kmod +./@MODULEDIR@/drvctl/drvctl.kmod base-kernel-modules lvm,kmod ./@MODULEDIR@/dtrace base-kernel-modules kmod,dtrace ./@MODULEDIR@/dtrace/dtrace.kmod base-kernel-modules kmod,dtrace ./@MODULEDIR@/dtrace_fbt base-kernel-modules kmod,dtrace Index: src/sys/kern/init_main.c diff -u src/sys/kern/init_main.c:1.475 src/sys/kern/init_main.c:1.476 --- src/sys/kern/init_main.c:1.475 Thu Nov 26 01:41:20 2015 +++ src/sys/kern/init_main.c Mon Dec 7 11:38:46 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: init_main.c,v 1.475 2015/11/26 01:41:20 ozaki-r Exp $ */ +/* $NetBSD: init_main.c,v 1.476 2015/12/07 11:38:46 pgoyette Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -97,7 +97,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.475 2015/11/26 01:41:20 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.476 2015/12/07 11:38:46 pgoyette Exp $"); #include "opt_ddb.h" #include "opt_inet.h" @@ -121,7 +121,6 @@ extern void *_binary_splash_image_start; extern void *_binary_splash_image_end; #endif -#include "drvctl.h" #include "ksyms.h" #include "veriexec.h" @@ -713,9 +712,6 @@ configure(void) config_twiddle_init(); pmf_init(); -#if NDRVCTL > 0 - drvctl_init(); -#endif /* Initialize driver modules */ module_init_class(MODULE_CLASS_DRIVER); Index: src/sys/kern/kern_drvctl.c diff -u src/sys/kern/kern_drvctl.c:1.39 src/sys/kern/kern_drvctl.c:1.40 --- src/sys/kern/kern_drvctl.c:1.39 Thu Aug 20 09:45:45 2015 +++ src/sys/kern/kern_drvctl.c Mon Dec 7 11:38:46 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_drvctl.c,v 1.39 2015/08/20 09:45:45 christos Exp $ */ +/* $NetBSD: kern_drvctl.c,v 1.40 2015/12/07 11:38:46 pgoyette Exp $ */ /* * Copyright (c) 2004 @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_drvctl.c,v 1.39 2015/08/20 09:45:45 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_drvctl.c,v 1.40 2015/12/07 11:38:46 pgoyette Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -47,6 +47,7 @@ __KERNEL_RCSID(0, "$NetBSD: kern_drvctl. #include <sys/stat.h> #include <sys/kauth.h> #include <sys/lwp.h> +#include <sys/module.h> #include "ioconf.h" @@ -105,6 +106,9 @@ static const struct fileops drvctl_fileo #define MAXLOCATORS 100 +extern int (*devmon_insert_vec)(const char *, prop_dictionary_t); +static int (*saved_insert_vec)(const char *, prop_dictionary_t) = NULL; + static int drvctl_command(struct lwp *, struct plistref *, u_long, int); static int drvctl_getevent(struct lwp *, struct plistref *, u_long, int); @@ -118,6 +122,15 @@ drvctl_init(void) } void +drvctl_fini(void) +{ + + seldestroy(&drvctl_rdsel); + cv_destroy(&drvctl_cond); + mutex_destroy(&drvctl_lock); +} + +int devmon_insert(const char *event, prop_dictionary_t ev) { struct drvctl_event *dce, *odce; @@ -127,21 +140,21 @@ devmon_insert(const char *event, prop_di if (drvctl_nopen == 0) { prop_object_release(ev); mutex_exit(&drvctl_lock); - return; + return 0; } /* Fill in mandatory member */ if (!prop_dictionary_set_cstring_nocopy(ev, "event", event)) { prop_object_release(ev); mutex_exit(&drvctl_lock); - return; + return 0; } dce = kmem_alloc(sizeof(*dce), KM_SLEEP); if (dce == NULL) { prop_object_release(ev); mutex_exit(&drvctl_lock); - return; + return 0; } dce->dce_event = ev; @@ -160,6 +173,7 @@ devmon_insert(const char *event, prop_di selnotify(&drvctl_rdsel, 0, 0); mutex_exit(&drvctl_lock); + return 0; } int @@ -580,3 +594,66 @@ drvctl_getevent(struct lwp *l, struct pl return ret; } + +/* + * Module glue + */ + +MODULE(MODULE_CLASS_DRIVER, drvctl, NULL); + +int +drvctl_modcmd(modcmd_t cmd, void *arg) +{ + int error; +#ifdef _MODULE + int bmajor, cmajor; +#endif + + error = 0; + switch (cmd) { + case MODULE_CMD_INIT: + drvctl_init(); + +#ifdef _MODULE + mutex_enter(&drvctl_lock); + bmajor = cmajor = -1; + error = devsw_attach("drvctl", NULL, &bmajor, + &drvctl_cdevsw, &cmajor); +#endif + if (error == 0) { + KASSERT(saved_insert_vec == NULL); + saved_insert_vec = devmon_insert_vec; + devmon_insert_vec = devmon_insert; + } + + mutex_exit(&drvctl_lock); + break; + + case MODULE_CMD_FINI: + mutex_enter(&drvctl_lock); + if (drvctl_nopen != 0 || drvctl_eventcnt != 0 ) { + mutex_exit(&drvctl_lock); + return EBUSY; + } + KASSERT(saved_insert_vec != NULL); + devmon_insert_vec = saved_insert_vec; + saved_insert_vec = NULL; +#ifdef _MODULE + error = devsw_detach(NULL, &drvctl_cdevsw); + if (error != 0) { + saved_insert_vec = devmon_insert_vec; + devmon_insert_vec = devmon_insert; + } +#endif + mutex_exit(&drvctl_lock); + if (error == 0) + drvctl_fini(); + + break; + default: + error = ENOTTY; + break; + } + + return error; +} Index: src/sys/kern/subr_autoconf.c diff -u src/sys/kern/subr_autoconf.c:1.236 src/sys/kern/subr_autoconf.c:1.237 --- src/sys/kern/subr_autoconf.c:1.236 Sun Nov 8 21:03:00 2015 +++ src/sys/kern/subr_autoconf.c Mon Dec 7 11:38:46 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_autoconf.c,v 1.236 2015/11/08 21:03:00 joerg Exp $ */ +/* $NetBSD: subr_autoconf.c,v 1.237 2015/12/07 11:38:46 pgoyette Exp $ */ /* * Copyright (c) 1996, 2000 Christopher G. Demetriou @@ -77,7 +77,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_autoconf.c,v 1.236 2015/11/08 21:03:00 joerg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_autoconf.c,v 1.237 2015/12/07 11:38:46 pgoyette Exp $"); #ifdef _KERNEL_OPT #include "opt_ddb.h" @@ -242,6 +242,9 @@ static callout_t config_twiddle_ch; static void sysctl_detach_setup(struct sysctllog **); +int no_devmon_insert(const char *, prop_dictionary_t); +int (*devmon_insert_vec)(const char *, prop_dictionary_t) = no_devmon_insert; + typedef int (*cfdriver_fn)(struct cfdriver *); static int frob_cfdrivervec(struct cfdriver * const *cfdriverv, @@ -517,15 +520,26 @@ config_finalize_mountroot(void) /* * Announce device attach/detach to userland listeners. */ + +int +no_devmon_insert(const char *name, prop_dictionary_t p) +{ + + return ENODEV; +} + static void devmon_report_device(device_t dev, bool isattach) { -#if NDRVCTL > 0 prop_dictionary_t ev; const char *parent; const char *what; device_t pdev = device_parent(dev); + /* If currently no drvctl device, just return */ + if (devmon_insert_vec == no_devmon_insert) + return; + ev = prop_dictionary_create(); if (ev == NULL) return; @@ -538,8 +552,8 @@ devmon_report_device(device_t dev, bool return; } - devmon_insert(what, ev); -#endif + if ((*devmon_insert_vec)(what, ev) != 0) + prop_object_release(ev); } /* Index: src/sys/modules/Makefile diff -u src/sys/modules/Makefile:1.163 src/sys/modules/Makefile:1.164 --- src/sys/modules/Makefile:1.163 Mon Dec 7 03:25:57 2015 +++ src/sys/modules/Makefile Mon Dec 7 11:38:46 2015 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.163 2015/12/07 03:25:57 pgoyette Exp $ +# $NetBSD: Makefile,v 1.164 2015/12/07 11:38:46 pgoyette Exp $ .include <bsd.own.mk> @@ -26,6 +26,7 @@ SUBDIR+= coredump SUBDIR+= dbcool SUBDIR+= des SUBDIR+= dk_subr +SUBDIR+= drvctl SUBDIR+= efs SUBDIR+= ext2fs SUBDIR+= exec_script Index: src/sys/sys/device.h diff -u src/sys/sys/device.h:1.147 src/sys/sys/device.h:1.148 --- src/sys/sys/device.h:1.147 Fri Mar 6 09:28:15 2015 +++ src/sys/sys/device.h Mon Dec 7 11:38:46 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: device.h,v 1.147 2015/03/06 09:28:15 mrg Exp $ */ +/* $NetBSD: device.h,v 1.148 2015/12/07 11:38:46 pgoyette Exp $ */ /* * Copyright (c) 1996, 2000 Christopher G. Demetriou @@ -429,6 +429,7 @@ int config_fini_component(struct cfdrive const struct cfattachinit *, struct cfdata *); void config_init_mi(void); void drvctl_init(void); +void drvctl_fini(void); int config_cfdriver_attach(struct cfdriver *); int config_cfdriver_detach(struct cfdriver *); Index: src/sys/sys/devmon.h diff -u src/sys/sys/devmon.h:1.1 src/sys/sys/devmon.h:1.2 --- src/sys/sys/devmon.h:1.1 Sun May 25 12:30:40 2008 +++ src/sys/sys/devmon.h Mon Dec 7 11:38:46 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: devmon.h,v 1.1 2008/05/25 12:30:40 jmcneill Exp $ */ +/* $NetBSD: devmon.h,v 1.2 2015/12/07 11:38:46 pgoyette Exp $ */ /* * Copyright (c) 2007 @@ -31,6 +31,6 @@ #ifndef _SYS_DEVMON_H_ #define _SYS_DEVMON_H_ -void devmon_insert(const char *, prop_dictionary_t); +int devmon_insert(const char *, prop_dictionary_t); #endif /*_SYS_DEVMON_H_*/ Added files: Index: src/sys/modules/drvctl/Makefile diff -u /dev/null src/sys/modules/drvctl/Makefile:1.1 --- /dev/null Mon Dec 7 11:38:46 2015 +++ src/sys/modules/drvctl/Makefile Mon Dec 7 11:38:46 2015 @@ -0,0 +1,11 @@ +# $NetBSD: Makefile,v 1.1 2015/12/07 11:38:46 pgoyette Exp $ + +.include "../Makefile.inc" + +.PATH: ${S}/kern + +KMOD= drvctl +IOCONF= drvctl.ioconf +SRCS= kern_drvctl.c + +.include <bsd.kmodule.mk> Index: src/sys/modules/drvctl/drvctl.ioconf diff -u /dev/null src/sys/modules/drvctl/drvctl.ioconf:1.1 --- /dev/null Mon Dec 7 11:38:46 2015 +++ src/sys/modules/drvctl/drvctl.ioconf Mon Dec 7 11:38:46 2015 @@ -0,0 +1,7 @@ +# $NetBSD: drvctl.ioconf,v 1.1 2015/12/07 11:38:46 pgoyette Exp $ + +ioconf drvctl + +include "conf/files" + +pseudo-device drvctl