bridge: Run fast when adding and deleting ports.
authorEthan Jackson <ethan@nicira.com>
Fri, 22 Jun 2012 01:14:33 +0000 (18:14 -0700)
committerEthan Jackson <ethan@nicira.com>
Fri, 22 Jun 2012 22:12:37 +0000 (15:12 -0700)
Adding and deleting ports can be extremely expensive so it makes
sense to get important work done before and after doing it.

Signed-off-by: Ethan Jackson <ethan@nicira.com>
ofproto/ofproto-dpif.c
vswitchd/bridge.c

index 77cb826deff6b3321da0f05c5b4f236c23026692..323d2083b5cf7987fe2c34067a1a2d88a61587ac 100644 (file)
@@ -6083,6 +6083,9 @@ lookup_input_bundle(const struct ofproto_dpif *ofproto, uint16_t in_port,
      *   we don't know about.
      *
      * - The ofproto client didn't configure the port as part of a bundle.
+     *   This is particularly likely to happen if a packet was received on the
+     *   port after it was created, but before the client had a chance to
+     *   configure its bundle.
      */
     if (warn) {
         static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
index 5a2b25170d8a2019875ac3f94159a99034d8b164..67e29d2d4efe99e9c43221dfddab51a1a96cbca5 100644 (file)
@@ -474,6 +474,11 @@ bridge_reconfigure_ofp(void)
         struct ofpp_garbage *garbage, *next;
 
         LIST_FOR_EACH_SAFE (garbage, next, list_node, &br->ofpp_garbage) {
+            /* It's a bit dangerous to call bridge_run_fast() here as ofproto's
+             * internal datastructures may not be consistent.  Eventually, when
+             * port additions and deletions are cheaper, these calls should be
+             * removed. */
+            bridge_run_fast();
             ofproto_port_del(br->ofproto, garbage->ofp_port);
             list_remove(&garbage->list_node);
             free(garbage);
@@ -482,6 +487,7 @@ bridge_reconfigure_ofp(void)
             if (time_msec() >= deadline) {
                 return false;
             }
+            bridge_run_fast();
         }
     }
 
@@ -1329,9 +1335,15 @@ iface_create(struct bridge *br, struct if_cfg *if_cfg, int ofp_port)
     hmap_remove(&br->if_cfg_todo, &if_cfg->hmap_node);
     free(if_cfg);
 
-    /* Do the bits that can fail up front. */
+    /* Do the bits that can fail up front.
+     *
+     * It's a bit dangerous to call bridge_run_fast() here as ofproto's
+     * internal datastructures may not be consistent.  Eventually, when port
+     * additions and deletions are cheaper, these calls should be removed. */
+    bridge_run_fast();
     assert(!iface_lookup(br, iface_cfg->name));
     error = iface_do_create(br, iface_cfg, port_cfg, &ofp_port, &netdev);
+    bridge_run_fast();
     if (error) {
         iface_clear_db_record(iface_cfg);
         return false;