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