svn commit: r237919 - in projects/calloutng/sys: conf kern
Davide Italiano
davide at FreeBSD.org
Sun Jul 1 11:52:53 UTC 2012
Author: davide
Date: Sun Jul 1 11:52:52 2012
New Revision: 237919
URL: http://svn.freebsd.org/changeset/base/237919
Log:
- Take in account aggregation when comparing event times in
callout_process() and when we submit events to eventtimers(4).
- Fix a bug in the 'steps' variable logic in softclock(). It shouldn't be
zeroed every time we extract a new event for processing it from cc_expireq.
- Indent string should be there, I wrongly removed it.
Reported by: mav [1,2], pluknet [3]
Modified:
projects/calloutng/sys/conf/NOTES
projects/calloutng/sys/kern/kern_timeout.c
Modified: projects/calloutng/sys/conf/NOTES
==============================================================================
--- projects/calloutng/sys/conf/NOTES Sun Jul 1 09:35:15 2012 (r237918)
+++ projects/calloutng/sys/conf/NOTES Sun Jul 1 11:52:52 2012 (r237919)
@@ -1,4 +1,4 @@
-
+# $FreeBSD$
#
# NOTES -- Lines that can be cut/pasted into kernel and hints configs.
#
Modified: projects/calloutng/sys/kern/kern_timeout.c
==============================================================================
--- projects/calloutng/sys/kern/kern_timeout.c Sun Jul 1 09:35:15 2012 (r237918)
+++ projects/calloutng/sys/kern/kern_timeout.c Sun Jul 1 11:52:52 2012 (r237919)
@@ -378,7 +378,9 @@ callout_process(void)
for (;;) {
sc = &cc->cc_callwheel[first];
TAILQ_FOREACH(tmp, sc, c_links.tqe) {
- if (bintime_cmp(&tmp->c_time, &now, <=)) {
+ next = tmp->c_time;
+ bintime_sub(&next, &tmp->c_precision);
+ if (bintime_cmp(&next, &now, <=)) {
/*
* Consumer told us the callout may be run
* directly from hardware interrupt context.
@@ -499,6 +501,7 @@ callout_cc_add(struct callout *c, struct
struct bintime to_bintime, void (*func)(void *), void *arg, int cpu,
int flags)
{
+ struct bintime bt;
int bucket, r_shift, r_val;
CC_LOCK_ASSERT(cc);
@@ -546,10 +549,12 @@ callout_cc_add(struct callout *c, struct
c, c_links.tqe);
/*
* Inform the eventtimers(4) subsystem there's a new callout
- * that has been inserted.
+ * that has been inserted, but only if really required.
*/
+ bt = c->c_time;
+ bintime_add(&bt, &c->c_precision);
if (callout_new_inserted != NULL &&
- (bintime_cmp(&c->c_time, &cc->cc_firstevent, <) ||
+ (bintime_cmp(&bt, &cc->cc_firstevent, <) ||
(cc->cc_firstevent.sec == 0 && cc->cc_firstevent.frac == 0))) {
cc->cc_firstevent = c->c_time;
(*callout_new_inserted)(cpu, c->c_time);
@@ -784,7 +789,6 @@ softclock(void *arg)
TAILQ_REMOVE(&cc->cc_expireq, c, c_staiter);
c = softclock_call_cc(c, cc, &mpcalls,
&lockcalls, &gcalls);
- steps = 0;
}
}
#ifdef CALLOUT_PROFILING
More information about the svn-src-projects
mailing list