Cleanup: document RCU read-side lock better
[lttng-tools.git] / src / common / ust-consumer / ust-consumer.c
index 0edb513f89c15263b2244983dcbf22626f95c734..8c15c7e135016098f3cb90a94923ec9eb3fc9d93 100644 (file)
@@ -581,6 +581,7 @@ static int flush_channel(uint64_t chan_key)
 
        DBG("UST consumer flush channel key %" PRIu64, chan_key);
 
+       rcu_read_lock();
        channel = consumer_find_channel(chan_key);
        if (!channel) {
                ERR("UST consumer flush channel %" PRIu64 " not found", chan_key);
@@ -591,20 +592,19 @@ static int flush_channel(uint64_t chan_key)
        ht = consumer_data.stream_per_chan_id_ht;
 
        /* For each stream of the channel id, flush it. */
-       rcu_read_lock();
        cds_lfht_for_each_entry_duplicate(ht->ht,
                        ht->hash_fct(&channel->key, lttng_ht_seed), ht->match_fct,
                        &channel->key, &iter.iter, stream, node_channel_id.node) {
                        ustctl_flush_buffer(stream->ustream, 1);
        }
-       rcu_read_unlock();
-
 error:
+       rcu_read_unlock();
        return ret;
 }
 
 /*
  * Close metadata stream wakeup_fd using the given key to retrieve the channel.
+ * RCU read side lock MUST be acquired before calling this function.
  *
  * Return 0 on success else an LTTng error code.
  */
@@ -883,6 +883,12 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                case LTTNG_UST_CHAN_PER_CPU:
                        channel->type = CONSUMER_CHANNEL_TYPE_DATA;
                        attr.type = LTTNG_UST_CHAN_PER_CPU;
+                       /*
+                        * Set refcount to 1 for owner. Below, we will
+                        * pass ownership to the
+                        * consumer_thread_channel_poll() thread.
+                        */
+                       channel->refcount = 1;
                        break;
                case LTTNG_UST_CHAN_METADATA:
                        channel->type = CONSUMER_CHANNEL_TYPE_METADATA;
@@ -898,10 +904,22 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                        goto end_channel_error;
                }
 
+               if (msg.u.ask_channel.type == LTTNG_UST_CHAN_METADATA) {
+                       ret = consumer_metadata_cache_allocate(channel);
+                       if (ret < 0) {
+                               ERR("Allocating metadata cache");
+                               goto end_channel_error;
+                       }
+                       consumer_timer_switch_start(channel, attr.switch_timer_interval);
+                       attr.switch_timer_interval = 0;
+               }
+
                /*
                 * Add the channel to the internal state AFTER all streams were created
                 * and successfully sent to session daemon. This way, all streams must
                 * be ready before this channel is visible to the threads.
+                * If add_channel succeeds, ownership of the channel is
+                * passed to consumer_thread_channel_poll().
                 */
                ret = add_channel(channel, ctx);
                if (ret < 0) {
@@ -923,16 +941,6 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                        goto end_nosignal;
                }
 
-               if (msg.u.ask_channel.type == LTTNG_UST_CHAN_METADATA) {
-                       ret = consumer_metadata_cache_allocate(channel);
-                       if (ret < 0) {
-                               ERR("Allocating metadata cache");
-                               goto end_channel_error;
-                       }
-                       consumer_timer_switch_start(channel, attr.switch_timer_interval);
-                       attr.switch_timer_interval = 0;
-               }
-
                break;
        }
        case LTTNG_CONSUMER_GET_CHANNEL:
@@ -1040,6 +1048,7 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                if (!channel) {
                        ERR("UST consumer push metadata %" PRIu64 " not found", key);
                        ret_code = LTTNG_ERR_UST_CHAN_NOT_FOUND;
+                       goto end_msg_sessiond;
                }
 
                /* Tell session daemon we are ready to receive the metadata. */
This page took 0.024207 seconds and 4 git commands to generate.