vswitchd: Avoid 100% CPU when secchan dies too many times.
authorBen Pfaff <blp@nicira.com>
Fri, 6 Feb 2009 23:07:38 +0000 (15:07 -0800)
committerBen Pfaff <blp@nicira.com>
Fri, 6 Feb 2009 23:07:50 +0000 (15:07 -0800)
vswitchd restarts secchan when necessary, but it limits the maximum number
of tries to avoid wasting CPU when secchan repeatedly dies.  Unfortunately,
when this happens it also throws vswitchd into a busy-wait by calling
process_wait() on the dead secchan process, because it doesn't clear out
the process from the bridge structure.

This commit clears out the secchan process from the bridge structure, so
that we don't attempt to wait on it any longer, and should fix the busy-wait
problem.

vswitchd/bridge.c

index 4b8a343a6a842d0bc790ee5ab716d6afaf1420ab..f4f351c0568d835d9e562fec6b7f7a5c578e8fbe 100644 (file)
@@ -572,6 +572,14 @@ start_secchan(struct bridge *br)
     char *dp_name;
     int retval;
 
+    /* Clean up vestiges of any previous secchan. */
+    rconn_disconnect(br->rconn);
+    if (br->secchan) {
+        process_destroy(br->secchan);
+        br->secchan = NULL;
+    }
+
+    /* Bail out if we've failed to start secchan too many times. */
     if (br->sc_retries >= 5) {
         VLOG_ERR("%s: restarted secchan maximum number of %d times, disabling",
                  br->name, br->sc_retries);
@@ -580,13 +588,6 @@ start_secchan(struct bridge *br)
     }
     br->sc_retries++;
 
-    /* Clean up vestiges of any previous secchan. */
-    rconn_disconnect(br->rconn);
-    if (br->secchan) {
-        process_destroy(br->secchan);
-        br->secchan = NULL;
-    }
-
     if (!br->controller) {
         /* Create socketpair for communicating with secchan subprocess. */
         if (socketpair(AF_LOCAL, SOCK_STREAM, 0, sockets)) {