[ovs-dev] [RFC v2 09/10] Avoid force recompute when not needed

Han Zhou zhouhan at gmail.com
Thu Mar 22 18:42:26 UTC 2018


---
 ovn/controller/ovn-controller.c | 11 ++++++++---
 ovn/lib/inc-proc-eng.c          | 19 +++++++++++++++++++
 ovn/lib/inc-proc-eng.h          |  3 +++
 3 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/ovn/controller/ovn-controller.c b/ovn/controller/ovn-controller.c
index 1fc41e2..b3324e1 100644
--- a/ovn/controller/ovn-controller.c
+++ b/ovn/controller/ovn-controller.c
@@ -1011,9 +1011,14 @@ main(int argc, char *argv[])
         }
         if (old_engine_run_id == engine_run_id ||
                 !ctx.ovnsb_idl_txn || !ctx.ovs_idl_txn) {
-            VLOG_DBG("engine did not run, force recompute next time: "
-                     "br_int %p, chassis %p", br_int, chassis);
-            engine_set_force_recompute(true);
+            if (engine_need_run(&en_flow_output)) {
+                VLOG_DBG("engine did not run, force recompute next time: "
+                         "br_int %p, chassis %p", br_int, chassis);
+                engine_set_force_recompute(true);
+            } else {
+                VLOG_DBG("engine did not run, and it was not needed either: "
+                         "br_int %p, chassis %p", br_int, chassis);
+            }
         } else {
             engine_set_force_recompute(false);
         }
diff --git a/ovn/lib/inc-proc-eng.c b/ovn/lib/inc-proc-eng.c
index c13a065..cb8489f 100644
--- a/ovn/lib/inc-proc-eng.c
+++ b/ovn/lib/inc-proc-eng.c
@@ -95,3 +95,22 @@ engine_run(struct engine_node *node, uint64_t run_id)
 
 }
 
+bool
+engine_need_run(struct engine_node *node)
+{
+    size_t i;
+
+    if (!node->n_inputs) {
+        node->run(node);
+        VLOG_DBG("input node: %s, changed: %d", node->name, node->changed);
+        return node->changed;
+    }
+
+    for (i = 0; i < node->n_inputs; i++) {
+        if (engine_need_run(node->inputs[i].node)) {
+            return true;
+        }
+    }
+
+    return false;
+}
diff --git a/ovn/lib/inc-proc-eng.h b/ovn/lib/inc-proc-eng.h
index 99c61a1..83d2c62 100644
--- a/ovn/lib/inc-proc-eng.h
+++ b/ovn/lib/inc-proc-eng.h
@@ -47,6 +47,9 @@ struct engine_node {
 void
 engine_run(struct engine_node *node, uint64_t run_id);
 
+bool
+engine_need_run(struct engine_node *node);
+
 static inline struct engine_node *
 engine_get_input(const char *input_name, struct engine_node *node)
 {
-- 
2.1.0



More information about the dev mailing list