From 6b803ddc8f864e03fb0087724dcc01e371c2fa17 Mon Sep 17 00:00:00 2001 From: Ethan Jackson Date: Thu, 21 Jun 2012 18:14:33 -0700 Subject: [PATCH] bridge: Run fast when adding and deleting ports. 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 --- ofproto/ofproto-dpif.c | 3 +++ vswitchd/bridge.c | 14 +++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 77cb826de..323d2083b 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -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); diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index 5a2b25170..67e29d2d4 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -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; -- 2.20.1