PERFORCE change 92231 for review

John Baldwin jhb at FreeBSD.org
Wed Feb 22 13:18:17 PST 2006


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

Change 92231 by jhb at jhb_slimer on 2006/02/22 21:17:47

	Minor nits, axe an extra int we didn't need, and expand some comments.

Affected files ...

.. //depot/projects/smpng/sys/kern/kern_timeout.c#28 edit

Differences ...

==== //depot/projects/smpng/sys/kern/kern_timeout.c#28 (text+ko) ====

@@ -78,8 +78,8 @@
 /**
  * Locked by callout_lock:
  *   curr_callout    - If a callout is in progress, it is curr_callout.
- *                     If curr_callout is non-NULL, threads waiting on
- *                     callout_wait will be woken up as soon as the 
+ *                     If curr_callout is non-NULL, threads waiting in
+ *                     callout_drain() will be woken up as soon as the 
  *                     relevant callout completes.
  *   curr_cancelled  - Changing to 1 with both callout_lock and c_mtx held
  *                     guarantees that the current callout will not run.
@@ -87,14 +87,12 @@
  *                     drops callout_lock to acquire c_mtx, and it calls
  *                     the handler only if curr_cancelled is still 0 after
  *                     c_mtx is successfully acquired.
- *   wakeup_needed   - If a thread is waiting on callout_wait, then
- *                     wakeup_needed is nonzero.  Set only when
+ *   callout_wait    - If a thread is waiting in callout_drain(), then
+ *                     callout_wait is nonzero.  Set only when
  *                     curr_callout is non-NULL.
- *   callout_wait    - Placeholder for a wait channel.
  */
 static struct callout *curr_callout;
 static int curr_cancelled;
-static int wakeup_needed;
 static int callout_wait;
 
 /*
@@ -246,8 +244,7 @@
 					 */
 					if (curr_cancelled) {
 						mtx_unlock(c_mtx);
-						mtx_lock_spin(&callout_lock);
-						goto done_locked;
+						goto skip;
 					}
 					/* The callout cannot be stopped now. */
 					curr_cancelled = 1;
@@ -292,16 +289,16 @@
 #endif
 				if ((c_flags & CALLOUT_RETURNUNLOCKED) == 0)
 					mtx_unlock(c_mtx);
+			skip:
 				mtx_lock_spin(&callout_lock);
-done_locked:
 				curr_callout = NULL;
-				if (wakeup_needed) {
+				if (callout_wait) {
 					/*
-					 * There might be someone waiting
+					 * There is someone waiting
 					 * for the callout to complete.
 					 */
 					wakeup(&callout_wait);
-					wakeup_needed = 0;
+					callout_wait = 0;
 				}
 				steps = 0;
 				c = nextsoftcheck;
@@ -423,7 +420,7 @@
 		 */
 		if (c->c_mtx != NULL && !curr_cancelled)
 			cancelled = curr_cancelled = 1;
-		if (wakeup_needed) {
+		if (callout_wait) {
 			/*
 			 * Someone has called callout_drain to kill this
 			 * callout.  Don't reschedule.
@@ -490,24 +487,38 @@
 
 	mtx_lock_spin(&callout_lock);
 	/*
-	 * Don't attempt to delete a callout that's not on the queue.
+	 * If the callout isn't pending, it's not on the queue, so
+	 * don't attempt to remove it from the queue.  We can try
+	 * to stop it by other means however.
 	 */
 	if (!(c->c_flags & CALLOUT_PENDING)) {
 		c->c_flags &= ~CALLOUT_ACTIVE;
-		if (c != curr_callout) {
-			mtx_unlock_spin(&callout_lock);
-			return (0);
-		}
-		rval = 0;
-		if (safe) {
-			/* We need to wait until the callout is finished. */
+
+		/*
+		 * If it wasn't on the queue and it isn't the current
+		 * callout, then we can't stop it, so just bail.
+		 */
+		if (c != curr_callout)
+			rval = 0;
+		else if (safe) {
+			/*
+			 * The current callout is running (or just about to
+			 * run) and blocking is allowed, so just wait for
+			 * the current invocation to finish.
+			 */
 			while (c == curr_callout) {
-				wakeup_needed = 1;
+				callout_wait = 1;
 				msleep_spin(&callout_wait, &callout_lock,
-				    "costop", 0);
+				    "codrain", 0);
 			}
+			rval = 0;
 		} else if (use_mtx && !curr_cancelled) {
-			/* We can stop the callout before it runs. */
+			/*
+			 * The current callout is waiting for it's mutex
+			 * which we hold.  Cancel the callout and return.
+			 * After our caller drops the mutex, the callout
+			 * will be skipped in softclock().
+			 */
 			curr_cancelled = 1;
 			rval = 1;
 		}


More information about the p4-projects mailing list