Fix: add missing rcu_barrier before daemon teardown
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 21 Dec 2016 22:59:38 +0000 (17:59 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Mon, 9 Jan 2017 16:59:41 +0000 (11:59 -0500)
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@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/bin/lttng-consumerd/lttng-consumerd.c
src/bin/lttng-relayd/main.c
src/bin/lttng-sessiond/main.c

index 1373a74b28212d5595d8c4f0dc18a89938e6a616..7f78c4ec2b0971fcfa249a3c35f7c953bd5a8d39 100644 (file)
@@ -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();
 
index 7b313818e5c09a5719339740f47b2787304d461b..919c5a96a7a2baa1680febd84ccb9e225fa3a386 100644 (file)
@@ -2937,6 +2937,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. */
index 85a35183fba5acc00a4cd80e755005c204396339..40670ddd52a5c150053e0ae0fe60ca6f1b252184 100644 (file)
@@ -6147,6 +6147,12 @@ exit_client:
 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.
This page took 0.039873 seconds and 4 git commands to generate.