Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src Modularize the clockctl pseudo-device and link to the build.



details:   https://anonhg.NetBSD.org/src/rev/ca1dfaf06c05
branches:  trunk
changeset: 812257:ca1dfaf06c05
user:      pgoyette <pgoyette%NetBSD.org@localhost>
date:      Mon Dec 07 03:25:57 2015 +0000

description:
Modularize the clockctl pseudo-device and link to the build.

diffstat:

 distrib/sets/lists/modules/mi        |    4 +-
 sys/compat/common/kern_time_50.c     |   69 +------------
 sys/dev/clockctl.c                   |  181 ++++++++++++++++++++++++++++++++++-
 sys/modules/Makefile                 |    3 +-
 sys/modules/clockctl/Makefile        |   13 ++
 sys/modules/clockctl/clockctl.ioconf |    7 +
 6 files changed, 204 insertions(+), 73 deletions(-)

diffs (truncated from 381 to 300 lines):

diff -r ab9964e25bd2 -r ca1dfaf06c05 distrib/sets/lists/modules/mi
--- a/distrib/sets/lists/modules/mi     Mon Dec 07 03:11:48 2015 +0000
+++ b/distrib/sets/lists/modules/mi     Mon Dec 07 03:25:57 2015 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.80 2015/12/03 02:57:47 pgoyette Exp $
+# $NetBSD: mi,v 1.81 2015/12/07 03:25:57 pgoyette Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -34,6 +34,8 @@
 ./@MODULEDIR@/cgd/cgd.kmod                     base-kernel-modules     kmod
 ./@MODULEDIR@/chfs                             base-kernel-modules     kmod
 ./@MODULEDIR@/chfs/chfs.kmod                   base-kernel-modules     kmod
+./@MODULEDIR@/clockctl                         base-kernel-modules     kmod
+./@MODULEDIR@/clockctl/clockctl.kmod           base-kernel-modules     kmod
 ./@MODULEDIR@/coda                             base-kernel-modules     kmod
 ./@MODULEDIR@/coda/coda.kmod                   base-kernel-modules     kmod
 ./@MODULEDIR@/coda5                            base-kernel-modules     kmod
diff -r ab9964e25bd2 -r ca1dfaf06c05 sys/compat/common/kern_time_50.c
--- a/sys/compat/common/kern_time_50.c  Mon Dec 07 03:11:48 2015 +0000
+++ b/sys/compat/common/kern_time_50.c  Mon Dec 07 03:25:57 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: kern_time_50.c,v 1.29 2015/07/24 13:02:52 maxv Exp $   */
+/*     $NetBSD: kern_time_50.c,v 1.30 2015/12/07 03:25:57 pgoyette Exp $       */
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_time_50.c,v 1.29 2015/07/24 13:02:52 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_time_50.c,v 1.30 2015/12/07 03:25:57 pgoyette Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_aio.h"
@@ -542,71 +542,6 @@
        return ENOSYS;
 #endif
 }
-int
-compat50_clockctlioctl(dev_t dev, u_long cmd, void *data, int flags,
-    struct lwp *l)
-{
-       int error = 0;
-       const struct cdevsw *cd = cdevsw_lookup(dev);
-
-       if (cd == NULL || cd->d_ioctl == NULL)
-               return ENXIO;
-
-       switch (cmd) {
-       case CLOCKCTL_OSETTIMEOFDAY: {
-               struct timeval50 tv50;
-               struct timeval tv;
-               struct clockctl50_settimeofday *args = data;
-
-               error = copyin(args->tv, &tv50, sizeof(tv50));
-               if (error)
-                       return (error);
-               timeval50_to_timeval(&tv50, &tv);
-               error = settimeofday1(&tv, false, args->tzp, l, false);
-               break;
-       }
-       case CLOCKCTL_OADJTIME: {
-               struct timeval atv, oldatv;
-               struct timeval50 atv50;
-               struct clockctl50_adjtime *args = data;
-
-               if (args->delta) {
-                       error = copyin(args->delta, &atv50, sizeof(atv50));
-                       if (error)
-                               return (error);
-                       timeval50_to_timeval(&atv50, &atv);
-               }
-               adjtime1(args->delta ? &atv : NULL,
-                   args->olddelta ? &oldatv : NULL, l->l_proc);
-               if (args->olddelta) {
-                       timeval_to_timeval50(&oldatv, &atv50);
-                       error = copyout(&atv50, args->olddelta, sizeof(atv50));
-               }
-               break;
-       }
-       case CLOCKCTL_OCLOCK_SETTIME: {
-               struct timespec50 tp50;
-               struct timespec tp;
-               struct clockctl50_clock_settime *args = data;
-
-               error = copyin(args->tp, &tp50, sizeof(tp50));
-               if (error)
-                       return (error);
-               timespec50_to_timespec(&tp50, &tp);
-               error = clock_settime1(l->l_proc, args->clock_id, &tp, true);
-               break;
-       }
-       case CLOCKCTL_ONTP_ADJTIME:
-               /* The ioctl number changed but the data did not change. */
-               error = (cd->d_ioctl)(dev, CLOCKCTL_NTP_ADJTIME,
-                   data, flags, l);
-               break;
-       default:
-               error = EINVAL;
-       }
-
-       return (error);
-}
 
 void
 compat_sysctl_time(struct sysctllog **clog)
diff -r ab9964e25bd2 -r ca1dfaf06c05 sys/dev/clockctl.c
--- a/sys/dev/clockctl.c        Mon Dec 07 03:11:48 2015 +0000
+++ b/sys/dev/clockctl.c        Mon Dec 07 03:25:57 2015 +0000
@@ -1,4 +1,4 @@
-/*      $NetBSD: clockctl.c,v 1.32 2014/07/25 08:10:35 dholland Exp $ */
+/*      $NetBSD: clockctl.c,v 1.33 2015/12/07 03:25:57 pgoyette Exp $ */
 
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -31,10 +31,12 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: clockctl.c,v 1.32 2014/07/25 08:10:35 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: clockctl.c,v 1.33 2015/12/07 03:25:57 pgoyette Exp $");
 
+#ifdef _KERNEL_OPT
 #include "opt_ntp.h"
 #include "opt_compat_netbsd.h"
+#endif
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -48,17 +50,28 @@
 #include <sys/timex.h>
 #endif /* NTP */
 #include <sys/kauth.h>
+#include <sys/module.h>
+#include <sys/mutex.h>
+#include <sys/once.h>
 
 #include <sys/clockctl.h>
 #ifdef COMPAT_50
 #include <compat/sys/clockctl.h>
+#include <compat/sys/time_types.h>
 #endif
 
+kmutex_t clockctl_mtx;
+int clockctl_refcnt;
+
+ONCE_DECL(clockctl_once);
+
+#include "ioconf.h"
+
 dev_type_ioctl(clockctlioctl);
 
 const struct cdevsw clockctl_cdevsw = {
-       .d_open = nullopen,
-       .d_close = nullclose,
+       .d_open = clockctlopen,
+       .d_close = clockctlclose,
        .d_read = noread,
        .d_write = nowrite,
        .d_ioctl = clockctlioctl,
@@ -102,8 +115,102 @@
 clockctlattach(int num)
 {
 
+/*
+ * Don't initialize the listener here - it will get handled as part
+ * of module initialization.
+ */
+#if 0
        clockctl_listener = kauth_listen_scope(KAUTH_SCOPE_SYSTEM,
            clockctl_listener_cb, NULL);
+#endif
+}
+
+/*
+ * Maintain a refcount for each open/close, so we know when it is
+ * safe to call devsw_detach()
+ */
+int
+clockctlopen(dev_t dev, int flag, int mode, struct lwp *l)
+{
+
+       mutex_enter(&clockctl_mtx);
+       clockctl_refcnt++;
+       mutex_exit(&clockctl_mtx);
+
+       return 0;
+}
+
+int
+clockctlclose(dev_t dev, int flag, int mode, struct lwp *l)
+{
+
+       mutex_enter(&clockctl_mtx);
+       clockctl_refcnt--;
+       mutex_exit(&clockctl_mtx);
+
+       return 0;
+}
+
+int
+clockctl_init(void)
+{
+
+       mutex_init(&clockctl_mtx, MUTEX_DEFAULT, IPL_NONE);
+       clockctl_refcnt = 0;
+       return 0;
+}
+
+MODULE(MODULE_CLASS_DRIVER, clockctl, NULL);
+
+int
+clockctl_modcmd(modcmd_t cmd, void *data)
+{
+       int error;
+#ifdef _MODULE
+       int bmajor, cmajor;
+#endif
+
+       error = 0;
+
+       switch (cmd) {
+       case MODULE_CMD_INIT:
+               RUN_ONCE(&clockctl_once, clockctl_init);
+
+               clockctl_listener = kauth_listen_scope(KAUTH_SCOPE_SYSTEM,
+                   clockctl_listener_cb, NULL);
+
+#ifdef _MODULE
+               bmajor = cmajor = -1;
+               error = devsw_attach("clockctl", NULL, &bmajor,
+                   &clockctl_cdevsw, &cmajor);
+               if (error != 0)
+                       kauth_unlisten_scope(clockctl_listener);
+#endif
+
+               break;
+
+       case MODULE_CMD_FINI:
+               mutex_enter(&clockctl_mtx);
+               if (clockctl_refcnt != 0) {
+                       mutex_exit(&clockctl_mtx);
+                       return EBUSY;
+               }
+#ifdef _MODULE
+               error = devsw_detach(NULL, &clockctl_cdevsw);
+#endif
+               mutex_exit(&clockctl_mtx);
+
+               if (error == 0)
+                       kauth_unlisten_scope(clockctl_listener);
+
+               break;
+
+       default:
+               error = ENOTTY;
+               break;
+       }
+
+       return error;
 }
 
 int
@@ -177,4 +284,70 @@
        return (error);
 }
 
+#ifdef COMPAT_50
+int
+compat50_clockctlioctl(dev_t dev, u_long cmd, void *data, int flags,
+    struct lwp *l)
+{
+       int error = 0;
+       const struct cdevsw *cd = cdevsw_lookup(dev);
 
+       if (cd == NULL || cd->d_ioctl == NULL)
+               return ENXIO;
+
+       switch (cmd) {
+       case CLOCKCTL_OSETTIMEOFDAY: {
+               struct timeval50 tv50;
+               struct timeval tv;
+               struct clockctl50_settimeofday *args = data;
+
+               error = copyin(args->tv, &tv50, sizeof(tv50));
+               if (error)
+                       return (error);
+               timeval50_to_timeval(&tv50, &tv);
+               error = settimeofday1(&tv, false, args->tzp, l, false);
+               break;
+       }
+       case CLOCKCTL_OADJTIME: {
+               struct timeval atv, oldatv;
+               struct timeval50 atv50;
+               struct clockctl50_adjtime *args = data;
+
+               if (args->delta) {
+                       error = copyin(args->delta, &atv50, sizeof(atv50));



Home | Main Index | Thread Index | Old Index