PERFORCE change 165347 for review

Prashant Vaibhav pvaibhav at FreeBSD.org
Sun Jun 28 17:18:43 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=165347

Change 165347 by pvaibhav at pvaibhav_matrix on 2009/06/28 17:17:50

	Modified callout_reset_on() to change the key of existing callouts
	instead of removing and reinserting the callout. This should fix
	problem of some callouts not being rescheduled properly, in addition
	to being more efficient in general.

Affected files ...

.. //depot/projects/soc2009/calloutapi/src/sys/kern/kern_timeout.c#5 edit

Differences ...

==== //depot/projects/soc2009/calloutapi/src/sys/kern/kern_timeout.c#5 (text+ko) ====

@@ -330,7 +330,8 @@
 	 * cc_monoticks might be modified by hardclock, so cache it
 	 */
 	curticks = cc->cc_monoticks;
-	CTR1(KTR_CALLOUT, "softclock run at %d", curticks);
+	CTR2(KTR_CALLOUT, "softclock run at %d, qsize %u",
+	    curticks, MINHEAP_SIZE(&cc->cc_callqueue));
 	while (!MINHEAP_EMPTY(&cc->cc_callqueue)) {
 		if (steps++ > MAX_SOFTCLOCK_STEPS) {
 			/*
@@ -594,14 +595,6 @@
 			return (cancelled);
 		}
 	}
-	if (c->c_flags & CALLOUT_PENDING) {
-		/* TODO: Just modify the key of existing callouts instead of
-		 * removing and re-inserting it
-		 */
-		MINHEAP_REMOVE(&cc->cc_callqueue, c, c_qe, c_time);
-		cancelled = 1;
-		c->c_flags &= ~(CALLOUT_ACTIVE | CALLOUT_PENDING);
-	}
 	/*
 	 * If the lock must migrate we have to check the state again as
 	 * we can't hold both the new and old locks simultaneously.
@@ -615,12 +608,21 @@
 	if (to_ticks <= 0)
 		to_ticks = 1;
 
-	c->c_arg = arg;
-	c->c_flags |= (CALLOUT_ACTIVE | CALLOUT_PENDING);
-	c->c_func = ftn;
-	c->c_time = cc->cc_monoticks + to_ticks;
+	if (c->c_flags & CALLOUT_PENDING) {
+		/* pending callout on the queue, just change the key */
+		cancelled = 1;
+		c->c_time = cc->cc_monoticks + to_ticks;
+
+		MINHEAP_KEY_CHANGE(&cc->cc_callqueue, c, c_qe, c_time);
+	} else {
+		/* new callout */
+		c->c_arg = arg;
+		c->c_flags |= (CALLOUT_ACTIVE | CALLOUT_PENDING);
+		c->c_func = ftn;
+		c->c_time = cc->cc_monoticks + to_ticks;
 
-	MINHEAP_INSERT(&cc->cc_callqueue, c, c_qe, c_time);
+		MINHEAP_INSERT(&cc->cc_callqueue, c, c_qe, c_time);
+	}
 
 	CTR5(KTR_CALLOUT, "%sscheduled %p func %p arg %p at %d",
 	    cancelled ? "re" : "", c, c->c_func, c->c_arg, c->c_time);


More information about the p4-projects mailing list