ofproto: Use RCU to protect rule_actions.
[sliver-openvswitch.git] / ofproto / ofproto-dpif.c
index 97eb2b8..2cdf856 100644 (file)
@@ -1371,9 +1371,14 @@ type_get_memory_usage(const char *type, struct simap *usage)
 }
 
 static void
-flush(struct ofproto *ofproto OVS_UNUSED)
+flush(struct ofproto *ofproto_)
 {
-    udpif_flush();
+    struct ofproto_dpif *ofproto = ofproto_dpif_cast(ofproto_);
+    struct dpif_backer *backer = ofproto->backer;
+
+    if (backer) {
+        udpif_flush(backer->udpif);
+    }
 }
 
 static void
@@ -3334,6 +3339,7 @@ group_destruct(struct ofgroup *group_)
 static enum ofperr
 group_modify(struct ofgroup *group_, struct ofgroup *victim_)
 {
+    struct ofproto_dpif *ofproto = ofproto_dpif_cast(group_->ofproto);
     struct group_dpif *group = group_dpif_cast(group_);
     struct group_dpif *victim = group_dpif_cast(victim_);
 
@@ -3344,6 +3350,8 @@ group_modify(struct ofgroup *group_, struct ofgroup *victim_)
     group_construct_stats(group);
     ovs_mutex_unlock(&group->stats_mutex);
 
+    ofproto->backer->need_revalidate = REV_FLOW_TABLE;
+
     return 0;
 }
 
@@ -3585,8 +3593,6 @@ trace_format_rule(struct ds *result, int level, const struct rule_dpif *rule)
     ds_put_cstr(result, "OpenFlow actions=");
     ofpacts_format(actions->ofpacts, actions->ofpacts_len, result);
     ds_put_char(result, '\n');
-
-    rule_actions_unref(actions);
 }
 
 static void