svn commit: r243096 - in projects/calloutng/sys: kern sys

Davide Italiano davide at FreeBSD.org
Thu Nov 15 19:23:40 UTC 2012


Author: davide
Date: Thu Nov 15 19:23:39 2012
New Revision: 243096
URL: http://svnweb.freebsd.org/changeset/base/243096

Log:
  - After a discussion with mav@, we decided it's probably better to provide
  KPI functions to specify both relative and absolute value of precision.
  - Fix a bug introduced in inittimecounter() in last commit.
  
  Reviewed by:	mav

Modified:
  projects/calloutng/sys/kern/kern_tc.c
  projects/calloutng/sys/kern/kern_timeout.c
  projects/calloutng/sys/sys/callout.h
  projects/calloutng/sys/sys/time.h

Modified: projects/calloutng/sys/kern/kern_tc.c
==============================================================================
--- projects/calloutng/sys/kern/kern_tc.c	Thu Nov 15 18:49:17 2012	(r243095)
+++ projects/calloutng/sys/kern/kern_tc.c	Thu Nov 15 19:23:39 2012	(r243096)
@@ -120,9 +120,10 @@ SYSCTL_INT(_kern_timecounter, OID_AUTO, 
     &timestepwarnings, 0, "Log time steps");
 
 int tc_timethreshold;
+int tc_timepercentage;
 struct bintime tick_bt;
-SYSCTL_INT(_kern, OID_AUTO, tc_timethreshold, CTLFLAG_RW, 
-    &tc_timethreshold, 0, "Precision threshold for timing measurements"); 
+SYSCTL_INT(_kern, OID_AUTO, tc_timepercentage, CTLFLAG_RW, 
+    &tc_timepercentage, 0, "Precision percentage tolerance"); 
 
 static void tc_windup(void);
 static void cpu_tick_calibrate(int);
@@ -1728,10 +1729,10 @@ inittimecounter(void *dummy)
 		tc_tick = (hz + 500) / 1000;
 	else
 		tc_tick = 1;
-	p = (tc_tick * 1000000) / hz;
-	tc_timethreshold = 20 * imin(1000000000 / hz, 1000000);
-	tick_rate = imax(hz, tc_tick);
+	tick_rate = hz / tc_tick;
+	tc_timethreshold = (100 / tc_timepercentage) * (1000000000 / tick_rate);
 	FREQ2BT(tick_rate, &tick_bt);
+	p = (tc_tick * 1000000) / hz;
 	printf("Timecounters tick every %d.%03u msec\n", p / 1000, p % 1000);
 
 #ifdef FFCLOCK

Modified: projects/calloutng/sys/kern/kern_timeout.c
==============================================================================
--- projects/calloutng/sys/kern/kern_timeout.c	Thu Nov 15 18:49:17 2012	(r243095)
+++ projects/calloutng/sys/kern/kern_timeout.c	Thu Nov 15 19:23:39 2012	(r243096)
@@ -583,7 +583,7 @@ callout_cc_add(struct callout *c, struct
 	c->c_func = func;
 	c->c_time = to_bintime;
 	bintime_clear(&c->c_precision);
-	r_val = C_PREC2BT(flags);
+	r_val = C_PABS2BT(flags);
 	c->c_precision.frac = r_val;
 	CTR3(KTR_CALLOUT, "precision set for %p: 0.%08x%08",
 	    c, (u_int) (r_val >> 32), (u_int) (r_val & 0xffffffff));

Modified: projects/calloutng/sys/sys/callout.h
==============================================================================
--- projects/calloutng/sys/sys/callout.h	Thu Nov 15 18:49:17 2012	(r243095)
+++ projects/calloutng/sys/sys/callout.h	Thu Nov 15 19:23:39 2012	(r243096)
@@ -51,19 +51,24 @@
 #define	CALLOUT_DIRECT 		0x0100 /* allow exec from hw int context */
 
 #define	C_DIRECT_EXEC		0x0001 /* direct execution of callout */
-#define	C_PRECISIONBITS		24
-#define	C_PRECISIONRANGE	((1 << C_PRECISIONBITS) - 1)
-#define	C_PRECISIONMASK		(1 << ((32 - C_PRECISIONBITS) - 1))
-#define	C_US2PREC(x)		(((x) * 4294) & C_PRECISIONMASK)
-#define	C_BT2PREC(x)		(((x) >> 32) & C_PRECISIONMASK)
-#define	C_PREC2BT(x)		((uint64_t)(flags & C_PRECISIONMASK) << 32)
+#define	C_PABSBITS		24
+#define	C_PABSMASK		(~((1 << (32 - C_PABSBITS)) - 1))
+#define	C_PABSRANGE		((1 << C_PABSBITS) - 1)
+#define	C_BT2PABS(x)		((x) >> 40)
+#define	C_SETPABS(x)		(((x) & C_PABSRANGE) << 8)
+#define	C_US2PABS(x)		(((x) * 4294) & ~C_PABSMASK)
+#define	C_PABS2BT(x)		((uint64_t)(flags & C_PABSMASK) << 32)
+#define	C_PRELBITS		5
+#define	C_PRELRANGE		((1 << C_PRELBITS) - 1)
+#define	C_PRELSET(x)		(((x) & C_PRELRANGE) << 1)
+#define	C_PRELGET(x)		(((x) >> 1) & C_PRELRANGE)
 
 /*
  * Common values specified for precision.
  */
-#define	C_P1MS			C_US2PREC(1000)
-#define	C_P10MS			C_US2PREC(10000)
-#define	C_P100MS		C_US2PREC(100000)
+#define	C_P1MS			C_US2PABS(1000)
+#define	C_P10MS			C_US2PABS(10000)
+#define	C_P100MS		C_US2PABS(100000)
 
 struct callout_handle {
 	struct callout *callout;

Modified: projects/calloutng/sys/sys/time.h
==============================================================================
--- projects/calloutng/sys/sys/time.h	Thu Nov 15 18:49:17 2012	(r243095)
+++ projects/calloutng/sys/sys/time.h	Thu Nov 15 19:23:39 2012	(r243096)
@@ -58,6 +58,8 @@ struct bintime {
 extern int tc_timethreshold;
 extern struct bintime tick_bt;
 
+#define	TC_DEFAULTPERC		5
+
 #define FREQ2BT(freq, bt)                                               \
 {                                                                       \
         (bt)->sec = 0;                                                  \


More information about the svn-src-projects mailing list