From: Mathieu Desnoyers Date: Wed, 10 Apr 2019 14:25:47 +0000 (-0400) Subject: Fix: don't access packet header for stream_id and stream_instance_id getters X-Git-Tag: v2.9.13~16 X-Git-Url: http://git.liburcu.org/?p=lttng-modules.git;a=commitdiff_plain;h=3ab60466d80cc644712a75e49593efc37786fb6d Fix: don't access packet header for stream_id and stream_instance_id getters The stream ID and stream instance ID are invariant for a stream, so there is no point reading them from the packet header currently owned by the consumer (between get/put subbuf). Actually, the consumer try to access the stream_id from the live timer when sending a live beacon without getting the reader subbuffer first. Doing so is racy against producers. In typical live scenarios (non-overwrite channels), the producers will always write the same stream id and stream instance id values at the same header offsets, which will "work", except for the initial state of an empty buffer: the value "0" will be returned (erroneously). For the less frequently used scenario of a live session with "overwrite" channels, this will trigger WARN_ON safety nets in libringbuffer. This safety net triggers a kernel OOPS report and disables tracing for that channel. In the case where a ring buffer does not have any data ready, it makes no sense to try to get a subbuffer for reading anyway, so the approach was broken. So return the stream id and stream instance id from the internal data structures rather than reading it from the ring buffer. Signed-off-by: Mathieu Desnoyers --- diff --git a/lttng-ring-buffer-client.h b/lttng-ring-buffer-client.h index 63f2b4ca..8916ab02 100644 --- a/lttng-ring-buffer-client.h +++ b/lttng-ring-buffer-client.h @@ -464,9 +464,10 @@ static int client_stream_id(const struct lib_ring_buffer_config *config, struct lib_ring_buffer *buf, uint64_t *stream_id) { - struct packet_header *header = client_packet_header(config, buf); - *stream_id = header->stream_id; + struct channel *chan = buf->backend.chan; + struct lttng_channel *lttng_chan = channel_get_private(chan); + *stream_id = lttng_chan->id; return 0; } @@ -495,8 +496,7 @@ int client_instance_id(const struct lib_ring_buffer_config *config, struct lib_ring_buffer *buf, uint64_t *id) { - struct packet_header *header = client_packet_header(config, buf); - *id = header->stream_instance_id; + *id = buf->backend.cpu; return 0; }