since the last lkml posting I've merged a few fixes and added comments
from Peter, and I've redone the "estimate_accuracy" function.
Rather than reposting the entire series, I'll point to the git tree at
and I've pasted the new function below.
Rather than having the hardcoded steps from the "Linus" function, I've
turned it into:
0 for realtime tasks
"0.1% of the time" for not-nice, not realtime tasks
"0.5% of the time" for nice, not realtime tasks
with a cap of 100msec for both.
I would like to request feedback on this approach; I think this is
better than the "hardcoded steps" as before, but maybe someone can come
up with an ever better idea....
static unsigned long __estimate_accuracy(struct timespec *tv)
unsigned long slack;
int divfactor = 1000;
divfactor = divfactor / 5;
slack = tv->tv_nsec / divfactor;
slack += tv->tv_sec * (NSEC_PER_SEC/divfactor);
if (slack > 100 * NSEC_PER_MSEC)
slack = 100 * NSEC_PER_MSEC;
static unsigned long estimate_accuracy(struct timespec *tv)
unsigned long ret;
struct timespec now;
* Realtime tasks get a slack of 0 for obvious reasons.
if (current->policy == SCHED_FIFO ||
current->policy == SCHED_RR)
now = timespec_sub(*tv, now);
ret = __estimate_accuracy(&now);
if (ret < current->timer_slack_ns)
On Sun, 07 Sep 2008 22:46:39 +0200
and it still doesn't strike me as "oh yeah"
hmm that's not exactly equivalent.. I can see either but still.
If you want to reach me at my work email, use firstname.lastname@example.org
For development, discussion and tips for power savings,