This commit allows users to log the call stack of
connectivity_seq_change().

Signed-off-by: Alex Wang <al...@nicira.com>
---
 lib/connectivity.c |   43 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/lib/connectivity.c b/lib/connectivity.c
index 59f8a39..639224e 100644
--- a/lib/connectivity.c
+++ b/lib/connectivity.c
@@ -16,9 +16,12 @@
 
 #include <config.h>
 
+#include "backtrace.h"
 #include "connectivity.h"
+#include "ovs-atomic.h"
 #include "ovs-thread.h"
 #include "seq.h"
+#include "unixctl.h"
 
 /* Provides a global seq for connectivity changes.
  *
@@ -26,7 +29,28 @@
  * module to report, check or wait on link/port status change.
  * */
 static struct seq *connectivity_seq;
+static atomic_bool log_source = ATOMIC_VAR_INIT(false);
 
+static void
+connectivity_unixctl_enable_log_source(struct unixctl_conn *conn,
+                                       int argc OVS_UNUSED,
+                                       const char *argv[] OVS_UNUSED,
+                                       void *aux OVS_UNUSED)
+{
+    atomic_store(&log_source, true);
+    unixctl_command_reply(conn, "log source enabled");
+}
+
+static void
+connectivity_unixctl_disable_log_source(struct unixctl_conn *conn,
+                                        int argc OVS_UNUSED,
+                                        const char *argv[] OVS_UNUSED,
+                                        void *aux OVS_UNUSED)
+{
+    atomic_store(&log_source, false);
+    unixctl_command_reply(conn, "log source disabled");
+}
+
 /* Runs only once to initialize 'connectivity_seq'. */
 static void
 connectivity_seq_init(void)
@@ -35,9 +59,21 @@ connectivity_seq_init(void)
 
     if (ovsthread_once_start(&once)) {
         connectivity_seq = seq_create();
+
+        unixctl_command_register("connectivity/enable-log-source", "", 0, 0,
+                                 connectivity_unixctl_enable_log_source, NULL);
+        unixctl_command_register("connectivity/disable-log-source", "", 0, 0,
+                                 connectivity_unixctl_disable_log_source, 
NULL);
         ovsthread_once_done(&once);
     }
 }
+
+/* Logs the calling stack. */
+static void
+log_call_stack(void)
+{
+    log_backtrace_msg("connectivity_seq");
+}
 
 /* Reads and returns the current 'connectivity_seq' value. */
 uint64_t
@@ -52,7 +88,14 @@ connectivity_seq_read(void)
 void
 connectivity_seq_change(void)
 {
+    bool log_enabled;
+
     connectivity_seq_init();
+
+    atomic_read(&log_source, &log_enabled);
+    if (log_enabled) {
+        log_call_stack();
+    }
     seq_change(connectivity_seq);
 }
 
-- 
1.7.9.5

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to