X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Fkernel-consumer%2Fkernel-consumer.c;h=551d8579a21ad4c6e86bed6904df6290c4304d24;hb=b0b335c8c5a963f24dbedb4e597f23ed66c5b915;hp=00bb7f7212cac7f0ccf4f4a6c91ef80dbb4b58ef;hpb=51d7db73266e8bf7e3248981d722d3743c38d670;p=lttng-tools.git diff --git a/src/common/kernel-consumer/kernel-consumer.c b/src/common/kernel-consumer/kernel-consumer.c index 00bb7f721..551d8579a 100644 --- a/src/common/kernel-consumer/kernel-consumer.c +++ b/src/common/kernel-consumer/kernel-consumer.c @@ -59,6 +59,9 @@ ssize_t lttng_kconsumer_on_read_subbuffer_mmap( uint64_t metadata_id; struct consumer_relayd_sock_pair *relayd = NULL; + /* RCU lock for the relayd pointer */ + rcu_read_lock(); + /* Flag that the current stream if set for network streaming. */ if (stream->net_seq_idx != -1) { relayd = consumer_find_relayd(stream->net_seq_idx); @@ -76,9 +79,6 @@ ssize_t lttng_kconsumer_on_read_subbuffer_mmap( goto end; } - /* RCU lock for the relayd pointer */ - rcu_read_lock(); - /* Handle stream on the relayd if the output is on the network */ if (relayd) { /* @@ -178,6 +178,9 @@ ssize_t lttng_kconsumer_on_read_subbuffer_splice( uint64_t metadata_id; struct consumer_relayd_sock_pair *relayd = NULL; + /* RCU lock for the relayd pointer */ + rcu_read_lock(); + /* Flag that the current stream if set for network streaming. */ if (stream->net_seq_idx != -1) { relayd = consumer_find_relayd(stream->net_seq_idx); @@ -186,9 +189,6 @@ ssize_t lttng_kconsumer_on_read_subbuffer_splice( } } - /* RCU lock for the relayd pointer */ - rcu_read_lock(); - /* Write metadata stream id before payload */ if (stream->metadata_flag && relayd) { /* @@ -374,6 +374,9 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx, return -ENOENT; } + /* relayd needs RCU read-side protection */ + rcu_read_lock(); + switch (msg.cmd_type) { case LTTNG_CONSUMER_ADD_RELAYD_SOCKET: { @@ -580,6 +583,7 @@ end: ret = write(ctx->consumer_poll_pipe[1], "", 1); } while (ret < 0 && errno == EINTR); end_nosignal: + rcu_read_unlock(); return 0; }