svn commit: r244199 - in projects/calloutng/sys: kern sys
Alexander Motin
mav at FreeBSD.org
Fri Dec 14 00:13:30 UTC 2012
Author: mav
Date: Fri Dec 14 00:13:29 2012
New Revision: 244199
URL: http://svnweb.freebsd.org/changeset/base/244199
Log:
- Extend precision range.
- Fix sysctl name.
Modified:
projects/calloutng/sys/kern/kern_tc.c
projects/calloutng/sys/kern/kern_timeout.c
projects/calloutng/sys/sys/callout.h
Modified: projects/calloutng/sys/kern/kern_tc.c
==============================================================================
--- projects/calloutng/sys/kern/kern_tc.c Thu Dec 13 23:32:47 2012 (r244198)
+++ projects/calloutng/sys/kern/kern_tc.c Fri Dec 14 00:13:29 2012 (r244199)
@@ -22,6 +22,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/kernel.h>
+#include <sys/limits.h>
#ifdef FFCLOCK
#include <sys/lock.h>
#include <sys/mutex.h>
@@ -124,13 +125,13 @@ struct bintime halftick_bt;
struct bintime tick_bt;
int tc_timeexp;
int tc_timepercentage = TC_DEFAULTPERC;
-TUNABLE_INT("kern.timecounter.allowdeviation", &tc_timepercentage);
+TUNABLE_INT("kern.timecounter.alloweddeviation", &tc_timepercentage);
int tc_timethreshold;
static int sysctl_kern_timecounter_adjprecision(SYSCTL_HANDLER_ARGS);
-SYSCTL_PROC(_kern_timecounter, OID_AUTO, tc_timepercentage,
+SYSCTL_PROC(_kern_timecounter, OID_AUTO, alloweddeviation,
CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, 0, 0,
- sysctl_kern_timecounter_adjprecision, "I",
- "Allowed deviation from absolute value");
+ sysctl_kern_timecounter_adjprecision, "I",
+ "Allowed time interval deviation in percents");
static void tc_windup(void);
static void cpu_tick_calibrate(int);
@@ -1722,11 +1723,18 @@ static void __inline
tc_adjprecision(void)
{
struct timespec ts;
- int tick_rate;
+ int tick_rate, t;
tick_rate = hz / tc_tick;
- tc_timethreshold = (1000000000 / (tick_rate * tc_timepercentage)) * 100;
- tc_timeexp = fls(roundup2(100 / tc_timepercentage, 2));
+ if (tc_timepercentage > 0) {
+ tc_timethreshold =
+ (1000000000 / (tick_rate * tc_timepercentage)) * 100;
+ t = (99 + tc_timepercentage) / tc_timepercentage;
+ tc_timeexp = fls(t + (t >> 1)) - 1;
+ } else {
+ tc_timethreshold = INT_MAX;
+ tc_timeexp = 31;
+ }
ts.tv_sec = tc_timethreshold / 1000000000;
ts.tv_nsec = tc_timethreshold % 1000000000;
timespec2bintime(&ts, &bt_timethreshold);
Modified: projects/calloutng/sys/kern/kern_timeout.c
==============================================================================
--- projects/calloutng/sys/kern/kern_timeout.c Thu Dec 13 23:32:47 2012 (r244198)
+++ projects/calloutng/sys/kern/kern_timeout.c Fri Dec 14 00:13:29 2012 (r244199)
@@ -938,7 +938,7 @@ _callout_reset_on(struct callout *c, str
if (to_ticks > 1)
bintime_mul(&to_bt, to_ticks);
bintime_add(&to_bt, &now);
- if (C_PRELGET(flags) == 0) {
+ if (C_PRELGET(flags) < 0) {
pr = halftick_bt;
} else {
to_ticks >>= C_PRELGET(flags);
Modified: projects/calloutng/sys/sys/callout.h
==============================================================================
--- projects/calloutng/sys/sys/callout.h Thu Dec 13 23:32:47 2012 (r244198)
+++ projects/calloutng/sys/sys/callout.h Fri Dec 14 00:13:29 2012 (r244199)
@@ -53,8 +53,8 @@
#define C_DIRECT_EXEC 0x0001 /* direct execution of callout */
#define C_PRELBITS 7
#define C_PRELRANGE ((1 << C_PRELBITS) - 1)
-#define C_PRELSET(x) ((x) << 1)
-#define C_PRELGET(x) (((x) >> 1) & C_PRELRANGE)
+#define C_PRELSET(x) (((x) + 1) << 1)
+#define C_PRELGET(x) (int)((((x) >> 1) & C_PRELRANGE) - 1)
struct callout_handle {
struct callout *callout;
More information about the svn-src-projects
mailing list