Fix: don't chain RCU free
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sun, 23 Aug 2015 03:14:44 +0000 (20:14 -0700)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Tue, 8 Sep 2015 13:10:52 +0000 (09:10 -0400)
We only do a single rcu_barrier() on teardown of sessiond. Therefore, if
we chain call_rcu, they may not all be executed before exit.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/bin/lttng-sessiond/trace-ust.c

index b4dcfe37dde72ca66ed573cf50571a0f46c1bfe4..befd5a61b69c779b5d5283a3ffa6faa77e74af83 100644 (file)
@@ -951,11 +951,6 @@ static void _trace_ust_destroy_channel(struct ltt_ust_channel *channel)
 
        DBG2("Trace destroy UST channel %s", channel->name);
 
-       /* Destroying all events of the channel */
-       destroy_events(channel->events);
-       /* Destroying all context of the channel */
-       destroy_contexts(channel->ctx);
-
        free(channel);
 }
 
@@ -974,6 +969,11 @@ static void destroy_channel_rcu(struct rcu_head *head)
 
 void trace_ust_destroy_channel(struct ltt_ust_channel *channel)
 {
+       /* Destroying all events of the channel */
+       destroy_events(channel->events);
+       /* Destroying all context of the channel */
+       destroy_contexts(channel->ctx);
+
        call_rcu(&channel->node.head, destroy_channel_rcu);
 }
 
@@ -999,18 +999,18 @@ void trace_ust_delete_channel(struct lttng_ht *ht,
  */
 static void destroy_channels(struct lttng_ht *channels)
 {
-       int ret;
        struct lttng_ht_node_str *node;
        struct lttng_ht_iter iter;
 
        assert(channels);
 
        rcu_read_lock();
-
        cds_lfht_for_each_entry(channels->ht, &iter.iter, node, node) {
-               ret = lttng_ht_del(channels, &iter);
-               assert(!ret);
-               call_rcu(&node->head, destroy_channel_rcu);
+               struct ltt_ust_channel *chan =
+                       caa_container_of(node, struct ltt_ust_channel, node);
+
+               trace_ust_delete_channel(channels, chan);
+               trace_ust_destroy_channel(chan);
        }
        rcu_read_unlock();
 
This page took 0.02793 seconds and 4 git commands to generate.