Author: lstewart
Date: Thu Dec  1 07:19:13 2011
New Revision: 228173
URL: http://svn.freebsd.org/changeset/base/228173

Log:
  Revise the sysctl handling code and restructure the hierarchy of sysctls
  introduced when feed-forward clock support is enabled in the kernel:
  
  - Rename the "choice" variable to "available".
  
  - Streamline the implementation of the "active" variable's sysctl handler
    function.
  
  - Create a kern.sysclock sysctl node for general sysclock related 
configuration
    options. Place the "available" and "active" variables under this node.
  
  - Create a kern.sysclock.ffclock sysctl node for feed-forward clock specific
    configuration options. Place the "version" and "ffcounter_bypass" variables
    under this node.
  
  - Tweak some of the description strings.
  
  Discussed with:       Julien Ridoux (jridoux at unimelb edu au)

Modified:
  head/sys/kern/kern_ffclock.c
  head/sys/sys/timeffc.h

Modified: head/sys/kern/kern_ffclock.c
==============================================================================
--- head/sys/kern/kern_ffclock.c        Thu Dec  1 05:54:22 2011        
(r228172)
+++ head/sys/kern/kern_ffclock.c        Thu Dec  1 07:19:13 2011        
(r228173)
@@ -148,31 +148,33 @@ ffclock_difftime(ffcounter ffdelta, stru
 }
 
 /*
- * Sysctl for the Feed-Forward Clock.
+ * Create a new kern.sysclock sysctl node, which will be home to some generic
+ * sysclock configuration variables. Feed-forward clock specific variables will
+ * live under the ffclock subnode.
  */
 
-static int ffclock_version = 2;
-SYSCTL_NODE(_kern, OID_AUTO, ffclock, CTLFLAG_RW, 0,
-    "Feed-Forward Clock Support");
-SYSCTL_INT(_kern_ffclock, OID_AUTO, version, CTLFLAG_RD, &ffclock_version, 0,
-    "Version of Feed-Forward Clock Support");
-
-/*
- * Sysctl to select which clock is read when calling any of the
- * [get]{bin,nano,micro}[up]time() functions.
- */
-char *sysclocks[] = {"feedback", "feed-forward"};
+SYSCTL_NODE(_kern, OID_AUTO, sysclock, CTLFLAG_RW, 0,
+    "System clock related configuration");
+SYSCTL_NODE(_kern_sysclock, OID_AUTO, ffclock, CTLFLAG_RW, 0,
+    "Feed-forward clock configuration");
 
+static char *sysclocks[] = {"feedback", "feed-forward"};
+#define        MAX_SYSCLOCK_NAME_LEN 16
 #define        NUM_SYSCLOCKS (sizeof(sysclocks) / sizeof(*sysclocks))
 
-/* Report or change the active timecounter hardware. */
+static int ffclock_version = 2;
+SYSCTL_INT(_kern_sysclock_ffclock, OID_AUTO, version, CTLFLAG_RD,
+    &ffclock_version, 0, "Feed-forward clock kernel version");
+
+/* List available sysclocks. */
 static int
-sysctl_kern_ffclock_choice(SYSCTL_HANDLER_ARGS)
+sysctl_kern_sysclock_available(SYSCTL_HANDLER_ARGS)
 {
        struct sbuf *s;
        int clk, error;
 
-       s = sbuf_new_for_sysctl(NULL, NULL, 16 * NUM_SYSCLOCKS, req);
+       s = sbuf_new_for_sysctl(NULL, NULL,
+           MAX_SYSCLOCK_NAME_LEN * NUM_SYSCLOCKS, req);
        if (s == NULL)
                return (ENOMEM);
 
@@ -187,47 +189,51 @@ sysctl_kern_ffclock_choice(SYSCTL_HANDLE
        return (error);
 }
 
-SYSCTL_PROC(_kern_ffclock, OID_AUTO, choice, CTLTYPE_STRING | CTLFLAG_RD,
-    0, 0, sysctl_kern_ffclock_choice, "A", "Clock paradigms available");
+SYSCTL_PROC(_kern_sysclock, OID_AUTO, available, CTLTYPE_STRING | CTLFLAG_RD,
+    0, 0, sysctl_kern_sysclock_available, "A",
+    "List of available system clocks");
 
+/*
+ * Return the name of the active system clock if read, or attempt to change
+ * the active system clock to the user specified one if written to. The active
+ * system clock is read when calling any of the [get]{bin,nano,micro}[up]time()
+ * functions.
+ */
 static int
-sysctl_kern_ffclock_active(SYSCTL_HANDLER_ARGS)
+sysctl_kern_sysclock_active(SYSCTL_HANDLER_ARGS)
 {
-       char newclock[32];
-       int error;
+       char newclock[MAX_SYSCLOCK_NAME_LEN];
+       int clk, error;
 
-       switch (sysclock_active) {
-       case SYSCLOCK_FBCK:
-               strlcpy(newclock, sysclocks[SYSCLOCK_FBCK], sizeof(newclock));
-               break;
-       case SYSCLOCK_FFWD:
-               strlcpy(newclock, sysclocks[SYSCLOCK_FFWD], sizeof(newclock));
-               break;
+       if (req->newptr == NULL) {
+               /* Return the name of the current active sysclock. */
+               strlcpy(newclock, sysclocks[sysclock_active], sizeof(newclock));
+               error = sysctl_handle_string(oidp, newclock,
+                   sizeof(newclock), req);
+       } else {
+               /* Change the active sysclock to the user specified one. */
+               error = EINVAL;
+               for (clk = 0; clk < NUM_SYSCLOCKS; clk++) {
+                       if (strncmp((char *)req->newptr, sysclocks[clk],
+                           strlen(sysclocks[clk])) == 0) {
+                               sysclock_active = clk;
+                               error = 0;
+                               break;
+                       }
+               }
        }
 
-       error = sysctl_handle_string(oidp, &newclock[0], sizeof(newclock), req);
-       if (error != 0 || req->newptr == NULL)
-               return (error);
-       if (strncmp(newclock, sysclocks[SYSCLOCK_FBCK],
-           sizeof(sysclocks[SYSCLOCK_FBCK])) == 0)
-               sysclock_active = SYSCLOCK_FBCK;
-       else if (strncmp(newclock, sysclocks[SYSCLOCK_FFWD],
-           sizeof(sysclocks[SYSCLOCK_FFWD])) == 0)
-               sysclock_active = SYSCLOCK_FFWD;
-       else
-               return (EINVAL);
-
        return (error);
 }
 
-SYSCTL_PROC(_kern_ffclock, OID_AUTO, active, CTLTYPE_STRING | CTLFLAG_RW,
-    0, 0, sysctl_kern_ffclock_active, "A", "Kernel clock selected");
-
-int sysctl_kern_ffclock_ffcounter_bypass = 0;
+SYSCTL_PROC(_kern_sysclock, OID_AUTO, active, CTLTYPE_STRING | CTLFLAG_RW,
+    0, 0, sysctl_kern_sysclock_active, "A",
+    "Name of the active system clock which is currently serving time");
 
-SYSCTL_INT(_kern_ffclock, OID_AUTO, ffcounter_bypass, CTLFLAG_RW,
+static int sysctl_kern_ffclock_ffcounter_bypass = 0;
+SYSCTL_INT(_kern_sysclock_ffclock, OID_AUTO, ffcounter_bypass, CTLFLAG_RW,
     &sysctl_kern_ffclock_ffcounter_bypass, 0,
-    "Use reliable hardware timecounter as the Feed-Forward Counter");
+    "Use reliable hardware timecounter as the feed-forward counter");
 
 /*
  * High level functions to access the Feed-Forward Clock.

Modified: head/sys/sys/timeffc.h
==============================================================================
--- head/sys/sys/timeffc.h      Thu Dec  1 05:54:22 2011        (r228172)
+++ head/sys/sys/timeffc.h      Thu Dec  1 07:19:13 2011        (r228173)
@@ -55,6 +55,12 @@ struct ffclock_estimate {
 #if __BSD_VISIBLE
 #ifdef _KERNEL
 
+/* Define the kern.sysclock sysctl tree. */
+SYSCTL_DECL(_kern_sysclock);
+
+/* Define the kern.sysclock.ffclock sysctl tree. */
+SYSCTL_DECL(_kern_sysclock_ffclock);
+
 /*
  * Index into the sysclocks array for obtaining the ASCII name of a particular
  * sysclock.
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to