vswitchd: Reduce number of calls to reconfigure() during mgmt updates
authorJustin Pettit <jpettit@nicira.com>
Sat, 20 Jun 2009 00:41:42 +0000 (17:41 -0700)
committerJustin Pettit <jpettit@nicira.com>
Sat, 20 Jun 2009 00:41:42 +0000 (17:41 -0700)
When we receive an OpenFlow management protocol Config Update, we
immediately force the switch to reconfigure itself.  This is
functionally correct, but it can cause long delays before return control
back to the switch.  We now keep track of whether there were any changes
and then only force a reconfigure once per management run.

vswitchd/mgmt.c
vswitchd/mgmt.h
vswitchd/ovs-vswitchd.c

index e43c6e87a04b2edcb3a74655cd067b2214ab7c77..a65934b6e40de6e61c5e0c9f41f7c16d75882890 100644 (file)
@@ -46,6 +46,7 @@
 
 static struct svec mgmt_cfg;
 static uint8_t cfg_cookie[CFG_COOKIE_LEN];
+static bool need_reconfigure = false;
 static struct rconn *mgmt_rconn;
 static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(60, 60);
 static struct svec capabilities;
@@ -655,8 +656,7 @@ recv_ofmp_config_update(uint32_t xid, const struct ofmp_header *ofmph,
      * connection settings may have changed. */
     send_config_update_ack(xid, true);
 
-    reconfigure();
-
+    need_reconfigure = true;
 
     return 0;
 }
@@ -807,15 +807,16 @@ handle_msg(uint32_t xid, const void *msg, size_t length)
     return handler(xid, msg);
 }
 
-void 
+bool 
 mgmt_run(void)
 {
     int i;
 
     if (!mgmt_rconn) {
-        return;
+        return false;
     }
 
+    need_reconfigure = false;
     rconn_run(mgmt_rconn);
 
     /* Do some processing, but cap it at a reasonable amount so that
@@ -837,6 +838,8 @@ mgmt_run(void)
             VLOG_WARN_RL(&rl, "received too-short OpenFlow message");
         }
     }
+
+    return need_reconfigure;
 }
 
 void
index 83950cd4dee3e4e2a7451ad19a1e42c5f1d30ec7..f05c9169c1cc711fc0ff47ff5bd10b80e2280efa 100644 (file)
@@ -18,7 +18,7 @@
 
 void mgmt_init(void);
 void mgmt_reconfigure(void);
-void mgmt_run(void);
+bool mgmt_run(void);
 void mgmt_wait(void);
 uint64_t mgmt_get_mgmt_id(void);
 
index 01a0e7edf2d03e50cc37b205715278f39c1dc9c2..8c87feab80ed7a1908c91872246e64d02cb9182b 100644 (file)
@@ -93,7 +93,9 @@ main(int argc, char *argv[])
             vlog_reopen_log_file();
             reconfigure();
         }
-        mgmt_run();
+        if (mgmt_run()) {
+            need_reconfigure = true;
+        }
         if (bridge_run()) {
             need_reconfigure = true;
         }