seq_read/seq_wait should be used before processing any changes.
Before this patch, if pinctrl thread tried to notify main thread
while ovn-controller already run  pinctrl_run but not yet pinctrl_wait,
the wake up was lost.

Signed-off-by: Xavier Simonart <[email protected]>
---
 controller/pinctrl.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/controller/pinctrl.c b/controller/pinctrl.c
index 84a1375b2..7fc111b24 100644
--- a/controller/pinctrl.c
+++ b/controller/pinctrl.c
@@ -4073,6 +4073,13 @@ pinctrl_run(struct ovsdb_idl_txn *ovnsb_idl_txn,
             int64_t cur_cfg)
 {
     ovs_mutex_lock(&pinctrl_mutex);
+
+    /* Do not wake up if no txn available. We will wake up on sb update.*/
+    if (ovnsb_idl_txn) {
+        int64_t new_seq = seq_read(pinctrl_main_seq);
+        seq_wait(pinctrl_main_seq, new_seq);
+    }
+
     run_put_mac_bindings(ovnsb_idl_txn, sbrec_datapath_binding_by_key,
                          sbrec_port_binding_by_key,
                          sbrec_mac_binding_by_lport_ip);
@@ -4593,8 +4600,6 @@ pinctrl_wait(struct ovsdb_idl_txn *ovnsb_idl_txn)
     wait_put_mac_bindings(ovnsb_idl_txn);
     wait_controller_event(ovnsb_idl_txn);
     wait_put_vport_bindings(ovnsb_idl_txn);
-    int64_t new_seq = seq_read(pinctrl_main_seq);
-    seq_wait(pinctrl_main_seq, new_seq);
     wait_put_fdbs(ovnsb_idl_txn);
     wait_activated_ports();
     ovs_mutex_unlock(&pinctrl_mutex);
-- 
2.47.1

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to