diff options
| author | pgoyette <pgoyette@NetBSD.org> | 2015-04-29 03:27:27 +0000 |
|---|---|---|
| committer | pgoyette <pgoyette@NetBSD.org> | 2015-04-29 03:27:27 +0000 |
| commit | 3367947c55a17c4dda7c8a030cd1dc60714cece0 (patch) | |
| tree | 481f92fa1a00c4aebdf6413f7d4640be809a2dc0 /sys/dev/sysmon/sysmon.c | |
| parent | 1104f5e2d2c366c9744ae11ebcd89819f674f0f7 (diff) | |
At suggestion from riastradh@ ...
Remove auto_configure(9) goop from sysmon device. It does make things
a bit cleaner, and also reduces source code by about 10%.
Tested via QEMU with no obvious side-effects.
Diffstat (limited to 'sys/dev/sysmon/sysmon.c')
| -rw-r--r-- | sys/dev/sysmon/sysmon.c | 155 |
1 files changed, 43 insertions, 112 deletions
diff --git a/sys/dev/sysmon/sysmon.c b/sys/dev/sysmon/sysmon.c index 7803b8ab76f..3981e851e6b 100644 --- a/sys/dev/sysmon/sysmon.c +++ b/sys/dev/sysmon/sysmon.c @@ -1,4 +1,4 @@ -/* $NetBSD: sysmon.c,v 1.24 2015/04/25 23:40:09 pgoyette Exp $ */ +/* $NetBSD: sysmon.c,v 1.25 2015/04/29 03:27:27 pgoyette Exp $ */ /*- * Copyright (c) 2000 Zembu Labs, Inc. @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sysmon.c,v 1.24 2015/04/25 23:40:09 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysmon.c,v 1.25 2015/04/29 03:27:27 pgoyette Exp $"); #include <sys/param.h> #include <sys/conf.h> @@ -52,6 +52,7 @@ __KERNEL_RCSID(0, "$NetBSD: sysmon.c,v 1.24 2015/04/25 23:40:09 pgoyette Exp $") #include <sys/module.h> #include <sys/mutex.h> #include <sys/device.h> +#include <sys/once.h> #include <dev/sysmon/sysmonvar.h> @@ -77,13 +78,8 @@ const struct cdevsw sysmon_cdevsw = { .d_flag = D_OTHER | D_MPSAFE }; -static int sysmon_match(device_t, cfdata_t, void *); -static void sysmon_attach(device_t, device_t, void *); -static int sysmon_detach(device_t, int); - static int sysmon_modcmd(modcmd_t, void *); - -CFDRIVER_DECL(sysmon, DV_DULL, NULL); +static int sm_init_once(void); /* * Info about our minor "devices" @@ -93,44 +89,13 @@ static int sysmon_refcnt[] = { 0, 0, 0 }; static const char *sysmon_mod[] = { "sysmon_envsys", "sysmon_wdog", "sysmon_power" }; +static kmutex_t sysmon_minor_mtx; -struct sysmon_softc { - device_t sc_dev; - kmutex_t sc_minor_mtx; -}; - -static device_t sysmon_dev = NULL; - -CFATTACH_DECL_NEW(sysmon, sizeof(struct sysmon_softc), - sysmon_match, sysmon_attach, sysmon_detach, NULL); -extern struct cfdriver sysmon_cd; - -static int -sysmon_match(device_t parent, cfdata_t data, void *aux) -{ - - return 1; -} - -static void -sysmon_attach(device_t parent, device_t self, void *aux) -{ - - struct sysmon_softc *sc = device_private(self); - - sc->sc_dev = self; - - mutex_init(&sc->sc_minor_mtx, MUTEX_DEFAULT, IPL_NONE); -} - -static int -sysmon_detach(device_t self, int flags) -{ - struct sysmon_softc *sc = device_private(self); +#ifdef _MODULE +static bool sm_is_attached; +#endif - mutex_destroy(&sc->sc_minor_mtx); - return 0; -} +ONCE_DECL(once_sm); /* * sysmon_attach_minor @@ -145,10 +110,9 @@ sysmon_detach(device_t self, int flags) int sysmon_attach_minor(int minor, struct sysmon_opvec *opvec) { - struct sysmon_softc *sc = device_private(sysmon_dev); int ret; - mutex_enter(&sc->sc_minor_mtx); + mutex_enter(&sysmon_minor_mtx); if (opvec) { if (sysmon_opvec_table[minor] == NULL) { sysmon_refcnt[minor] = 0; @@ -164,7 +128,7 @@ sysmon_attach_minor(int minor, struct sysmon_opvec *opvec) ret = EBUSY; } - mutex_exit(&sc->sc_minor_mtx); + mutex_exit(&sysmon_minor_mtx); return ret; } @@ -176,20 +140,19 @@ sysmon_attach_minor(int minor, struct sysmon_opvec *opvec) int sysmonopen(dev_t dev, int flag, int mode, struct lwp *l) { - struct sysmon_softc *sc = device_private(sysmon_dev); int error; - mutex_enter(&sc->sc_minor_mtx); + mutex_enter(&sysmon_minor_mtx); switch (minor(dev)) { case SYSMON_MINOR_ENVSYS: case SYSMON_MINOR_WDOG: case SYSMON_MINOR_POWER: if (sysmon_opvec_table[minor(dev)] == NULL) { - mutex_exit(&sc->sc_minor_mtx); + mutex_exit(&sysmon_minor_mtx); error = module_autoload(sysmon_mod[minor(dev)], MODULE_CLASS_MISC); - mutex_enter(&sc->sc_minor_mtx); + mutex_enter(&sysmon_minor_mtx); if (sysmon_opvec_table[minor(dev)] == NULL) error = ENODEV; } @@ -202,7 +165,7 @@ sysmonopen(dev_t dev, int flag, int mode, struct lwp *l) error = ENODEV; } - mutex_exit(&sc->sc_minor_mtx); + mutex_exit(&sysmon_minor_mtx); return (error); } @@ -342,65 +305,36 @@ sysmonkqfilter(dev_t dev, struct knote *kn) MODULE(MODULE_CLASS_DRIVER, sysmon, ""); +static int +sm_init_once(void) +{ + + mutex_init(&sysmon_minor_mtx, MUTEX_DEFAULT, IPL_NONE); + + return 0; +} + int sysmon_init(void) { + int error; #ifdef _MODULE devmajor_t bmajor, cmajor; #endif - static struct cfdata cf; - int error = 0; - if (sysmon_dev != NULL) { - return EEXIST; - } - - error = config_cfdriver_attach(&sysmon_cd); - if (error) { - aprint_error("%s: unable to attach cfdriver\n", - sysmon_cd.cd_name); - return error; - } - error = config_cfattach_attach(sysmon_cd.cd_name, &sysmon_ca); - if (error) { - config_cfdriver_detach(&sysmon_cd); - aprint_error("%s: unable to attach cfattach\n", - sysmon_cd.cd_name); - return error; - } + error = RUN_ONCE(&once_sm, sm_init_once); #ifdef _MODULE - bmajor = cmajor = -1; - error = devsw_attach("sysmon", NULL, &bmajor, - &sysmon_cdevsw, &cmajor); - if (error) { - config_cfattach_detach(sysmon_cd.cd_name, &sysmon_ca); - config_cfdriver_detach(&sysmon_cd); - aprint_error("%s: unable to attach devsw\n", - sysmon_cd.cd_name); - return error; + mutex_enter(&sysmon_minor_mtx); + if (!sm_is_attached) { + bmajor = cmajor = -1; + error = devsw_attach("sysmon", NULL, &bmajor, + &sysmon_cdevsw, &cmajor); + sm_is_attached = (error != 0); } + mutex_exit(&sysmon_minor_mtx); #endif - cf.cf_name = sysmon_cd.cd_name; - cf.cf_atname = sysmon_cd.cd_name; - cf.cf_unit = 0; - cf.cf_fstate = FSTATE_STAR; - cf.cf_pspec = NULL; - cf.cf_loc = NULL; - cf.cf_flags = 0; - - sysmon_dev = config_attach_pseudo(&cf); - if (sysmon_dev == NULL) { - aprint_error("%s: failed to attach pseudo device\n", - sysmon_cd.cd_name); - error = ENODEV; - } - - if (!pmf_device_register(sysmon_dev, NULL, NULL)) - aprint_error("%s: failed to register with pmf\n", - sysmon_cd.cd_name); - return error; } @@ -409,22 +343,19 @@ sysmon_fini(void) { int error = 0; - if (sysmon_opvec_table[SYSMON_MINOR_ENVSYS] != NULL) - error = EBUSY; - else if (sysmon_opvec_table[SYSMON_MINOR_WDOG] != NULL) - error = EBUSY; - else if (sysmon_opvec_table[SYSMON_MINOR_POWER] != NULL) + if ((sysmon_opvec_table[SYSMON_MINOR_ENVSYS] != NULL) || + (sysmon_opvec_table[SYSMON_MINOR_WDOG] != NULL) || + (sysmon_opvec_table[SYSMON_MINOR_POWER] != NULL)) error = EBUSY; - else { - pmf_device_deregister(sysmon_dev); - config_detach(sysmon_dev, 0); - devsw_detach(NULL, &sysmon_cdevsw); - config_cfattach_detach(sysmon_cd.cd_name, &sysmon_ca); - config_cfdriver_detach(&sysmon_cd); +#ifdef _MODULE + if (error == 0) { + mutex_enter(&sysmon_minor_mtx); + sm_is_attached = false; + error = devsw_detach(NULL, &sysmon_cdevsw); + mutex_exit(&sysmon_minor_mtx); } - if (error == 0) - sysmon_dev = NULL; +#endif return error; } |
