[ovs-dev] [master fix] recirculation: RCU postpone the free of dpif_backer_recirc_node.
Alex Wang
alexw at nicira.com
Tue Dec 23 18:30:01 UTC 2014
This commit RCU postpones the free of 'struct dpif_backer_recirc_node',
after it is removed from the cmap. This is in that other threads may
be accessing the struct at the same time.
Signed-off-by: Alex Wang <alexw at nicira.com>
---
ofproto/ofproto-dpif.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 2166e91..846ef57 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -59,6 +59,7 @@
#include "ofproto-dpif-upcall.h"
#include "ofproto-dpif-xlate.h"
#include "poll-loop.h"
+#include "ovs-rcu.h"
#include "ovs-router.h"
#include "seq.h"
#include "simap.h"
@@ -868,7 +869,11 @@ dpif_backer_recirc_clear_ofproto(struct dpif_backer *backer,
"is destructed", node->recirc_id, ofproto->up.name);
cmap_remove(&backer->recirc_map, &node->cmap_node,
node->recirc_id);
- free(node);
+ /* Does not matter whether directly free or use ovsrcu_postpone,
+ * since all datapath flows are already purged before calling this
+ * function, and no 'recirc_id' could be associated to 'ofproto'.
+ */
+ ovsrcu_postpone(free, node);
}
}
ovs_mutex_unlock(&backer->recirc_mutex);
@@ -5457,7 +5462,9 @@ ofproto_dpif_free_recirc_id(struct ofproto_dpif *ofproto, uint32_t recirc_id)
cmap_remove(&backer->recirc_map, &node->cmap_node, node->recirc_id);
ovs_mutex_unlock(&backer->recirc_mutex);
recirc_id_free(backer->rid_pool, node->recirc_id);
- free(node);
+ /* RCU postpone the free, since other threads may be referring
+ * to 'node' at same time. */
+ ovsrcu_postpone(free, node);
}
}
--
1.7.9.5
More information about the dev
mailing list