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

Reply via email to