[lttng-dev] [PATCH lttng-tools] Fix: add missing rcu_barrier before daemon teardown

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Wed Dec 21 22:59:38 UTC 2016


When performing the "cleanup" of sessiond, consumerd, and relayd, we
destroy data structures that may still be concurrently accessed by
call_rcu worker thread.

Ensure no more work is present in the call_rcu worker thread by issuing
a rcu_barrier barrier. Note that this expects call_rcu handlers don't
chain work to other call_rcu handlers.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
---
 src/bin/lttng-consumerd/lttng-consumerd.c | 6 ++++++
 src/bin/lttng-relayd/main.c               | 6 ++++++
 src/bin/lttng-sessiond/main.c             | 6 ++++++
 3 files changed, 18 insertions(+)

diff --git a/src/bin/lttng-consumerd/lttng-consumerd.c b/src/bin/lttng-consumerd/lttng-consumerd.c
index 1373a74..7f78c4e 100644
--- a/src/bin/lttng-consumerd/lttng-consumerd.c
+++ b/src/bin/lttng-consumerd/lttng-consumerd.c
@@ -622,6 +622,12 @@ exit_init_data:
 	tmp_ctx = ctx;
 	ctx = NULL;
 	cmm_barrier();	/* Clear ctx for signal handler. */
+	/*
+	 * Wait for all pending call_rcu work to complete before tearing
+	 * down data structures. call_rcu worker may be trying to
+	 * perform lookups in those structures.
+	 */
+	rcu_barrier();
 	lttng_consumer_destroy(tmp_ctx);
 	lttng_consumer_cleanup();
 
diff --git a/src/bin/lttng-relayd/main.c b/src/bin/lttng-relayd/main.c
index dc19a69..9f26be5 100644
--- a/src/bin/lttng-relayd/main.c
+++ b/src/bin/lttng-relayd/main.c
@@ -2932,6 +2932,12 @@ exit_init_data:
 	health_app_destroy(health_relayd);
 exit_health_app_create:
 exit_options:
+	/*
+	 * Wait for all pending call_rcu work to complete before tearing
+	 * down data structures. call_rcu worker may be trying to
+	 * perform lookups in those structures.
+	 */
+	rcu_barrier();
 	relayd_cleanup();
 
 	/* Ensure all prior call_rcu are done. */
diff --git a/src/bin/lttng-sessiond/main.c b/src/bin/lttng-sessiond/main.c
index 85a3518..40670dd 100644
--- a/src/bin/lttng-sessiond/main.c
+++ b/src/bin/lttng-sessiond/main.c
@@ -6148,6 +6148,12 @@ exit_health:
 
 exit_init_data:
 	/*
+	 * Wait for all pending call_rcu work to complete before tearing
+	 * down data structures. call_rcu worker may be trying to
+	 * perform lookups in those structures.
+	 */
+	rcu_barrier();
+	/*
 	 * sessiond_cleanup() is called when no other thread is running, except
 	 * the ht_cleanup thread, which is needed to destroy the hash tables.
 	 */
-- 
2.1.4



More information about the lttng-dev mailing list