rx-avoid-unnecessary-wakeups-20011225
authorNickolai Zeldovich <kolya@mit.edu>
Tue, 25 Dec 2001 18:13:20 +0000 (18:13 +0000)
committerDerrick Brashear <shadow@dementia.org>
Tue, 25 Dec 2001 18:13:20 +0000 (18:13 +0000)
"This fixes a livelock condition introduced in my earlier
  resource starvation patch; apparently I had erred too far
  on the side of "wake up just in case".  The livelock bug
  is exhibited when running 10 fsstress processes at once;
  if many processes are waiting for a new Rx call, they get
  stuck in an uninterruptible kernel loop waking each other
  up."

src/rx/rx.c

index ea98ff2..998b63a 100644 (file)
@@ -1053,17 +1053,16 @@ struct rx_call *rx_NewCall(conn)
        osi_rxSleep(conn);
 #endif
        conn->makeCallWaiters--;
-
-       /*
-        * Wake up anyone else who might be giving us a chance to
-        * run (see code above that avoids resource starvation).
-        */
+    }
+    /*
+     * Wake up anyone else who might be giving us a chance to
+     * run (see code above that avoids resource starvation).
+     */
 #ifdef RX_ENABLE_LOCKS
-       CV_BROADCAST(&conn->conn_call_cv);
+    CV_BROADCAST(&conn->conn_call_cv);
 #else
-       osi_rxWakeup(conn);
+    osi_rxWakeup(conn);
 #endif
-    }
 
     CALL_HOLD(call, RX_CALL_REFCOUNT_BEGIN);