[ovs-dev] [PATCH ovn v2 2/3] northd.c: Lock to protect against possible od->group corruption.

Han Zhou hzhou at ovn.org
Sun Oct 3 22:45:13 UTC 2021


When parallel build is used, od->group can be updated by threads outside
of the function do_ovn_lflow_add_pd (for lb related flow building). So
use the function ovn_dp_group_add_with_reference() to update it in
function do_ovn_lflow_add() when it is not a newly created flow.

Signed-off-by: Han Zhou <hzhou at ovn.org>
---
 northd/northd.c | 42 +++++++++++++++++++++---------------------
 1 file changed, 21 insertions(+), 21 deletions(-)

diff --git a/northd/northd.c b/northd/northd.c
index 027c5b170..afd812700 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -4299,6 +4299,26 @@ ovn_lflow_init(struct ovn_lflow *lflow, struct ovn_datapath *od,
     }
 }
 
+static bool
+ovn_dp_group_add_with_reference(struct ovn_lflow *lflow_ref,
+                                struct ovn_datapath *od)
+                                OVS_NO_THREAD_SAFETY_ANALYSIS
+{
+    if (!use_logical_dp_groups || !lflow_ref) {
+        return false;
+    }
+
+    if (use_parallel_build) {
+        ovs_mutex_lock(&lflow_ref->odg_lock);
+        hmapx_add(&lflow_ref->od_group, od);
+        ovs_mutex_unlock(&lflow_ref->odg_lock);
+    } else {
+        hmapx_add(&lflow_ref->od_group, od);
+    }
+
+    return true;
+}
+
 /* Adds a row with the specified contents to the Logical_Flow table.
  * Version to use with dp_groups + parallel - when locking is required.
  *
@@ -4351,7 +4371,7 @@ do_ovn_lflow_add(struct hmap *lflow_map, struct ovn_datapath *od,
         old_lflow = ovn_lflow_find(lflow_map, NULL, stage, priority, match,
                                    actions, ctrl_meter, hash);
         if (old_lflow) {
-            hmapx_add(&old_lflow->od_group, od);
+            ovn_dp_group_add_with_reference(old_lflow, od);
             return old_lflow;
         }
     }
@@ -4466,26 +4486,6 @@ ovn_lflow_add_at(struct hmap *lflow_map, struct ovn_datapath *od,
                                io_port, ctrl_meter, stage_hint, where, hash);
 }
 
-static bool
-ovn_dp_group_add_with_reference(struct ovn_lflow *lflow_ref,
-                                struct ovn_datapath *od)
-                                OVS_NO_THREAD_SAFETY_ANALYSIS
-{
-    if (!use_logical_dp_groups || !lflow_ref) {
-        return false;
-    }
-
-    if (use_parallel_build) {
-        ovs_mutex_lock(&lflow_ref->odg_lock);
-        hmapx_add(&lflow_ref->od_group, od);
-        ovs_mutex_unlock(&lflow_ref->odg_lock);
-    } else {
-        hmapx_add(&lflow_ref->od_group, od);
-    }
-
-    return true;
-}
-
 /* Adds a row with the specified contents to the Logical_Flow table. */
 #define ovn_lflow_add_with_hint__(LFLOW_MAP, OD, STAGE, PRIORITY, MATCH, \
                                   ACTIONS, IN_OUT_PORT, CTRL_METER, \
-- 
2.30.2



More information about the dev mailing list