PERFORCE change 165049 for review
Prashant Vaibhav
pvaibhav at FreeBSD.org
Wed Jun 24 14:47:38 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=165049
Change 165049 by pvaibhav at pvaibhav_matrix on 2009/06/24 14:46:44
Some minor improvements in softclock():
1. Use cached 'ticks' instead of cc->cc_monoticks directly. This
will avoid the softclock potentially running too long as it
chases behind monoticks, in cases where monoticks is modified
while softclock is still executing
2. Check if number of callouts processed during a single invocation
of softclock() is more than a threshold value. If yes, temporarily
unlock cc_lock so interrupts can be processed. This was present in
the original softclock() implementation too.
3. Corrected order of temporary unlocking and extracting first pending
callout -- extraction should always be done after re-acquiring the
cc_lock.
Affected files ...
.. //depot/projects/soc2009/calloutapi/src/sys/kern/kern_timeout.c#4 edit
Differences ...
==== //depot/projects/soc2009/calloutapi/src/sys/kern/kern_timeout.c#4 (text+ko) ====
@@ -260,7 +260,7 @@
* it with cc_lock held; incorrect locking order.
*/
mtx_unlock_spin_flags(&cc->cc_lock, MTX_QUIET);
- if (need_softclock)
+ if (need_softclock == 1)
swi_sched(cc->cc_cookie, 0);
}
@@ -304,11 +304,11 @@
{
struct callout_cpu *cc;
struct callout *c;
- int curticks;
- int depth;
+ int steps;
int mpcalls;
int lockcalls;
int gcalls;
+ int curticks;
#ifdef DIAGNOSTIC
struct bintime bt1, bt2;
struct timespec ts2;
@@ -323,15 +323,24 @@
mpcalls = 0;
lockcalls = 0;
gcalls = 0;
- depth = 0;
+ steps = 0;
cc = (struct callout_cpu *)arg;
CC_LOCK(cc);
/*
- * ticks may be modified by hard clock, so cache it
+ * cc_monoticks might be modified by hardclock, so cache it
*/
curticks = cc->cc_monoticks;
CTR1(KTR_CALLOUT, "softclock run at %d", curticks);
while (!MINHEAP_EMPTY(&cc->cc_callqueue)) {
+ if (steps++ > MAX_SOFTCLOCK_STEPS) {
+ /*
+ * Give interrupts a chance
+ */
+ CC_UNLOCK(cc);
+ ; /* nothing */
+ CC_LOCK(cc);
+ steps = 0;
+ }
c = MINHEAP_FIRST(&cc->cc_callqueue);
if (c->c_time > curticks) {
/*
More information about the p4-projects
mailing list