Destroying a session with at least one enabled event and which has never
been started will currently result in an error message in the kernel log
about 'non-consumed data' for each of the per-cpu buffer. This happens
because a packet header is created in the buffer but never consumed if
the session is not started.
Add a check in the buffer cleanup code to avoid printing 'non-consumed
data' errors for buffers associated with a session taht was never
started.
Change-Id: I1358e1ae49d03544a961515b97b115a488434e27
Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
int finalized; /* Has channel been finalized */
struct channel_iter iter; /* Channel read-side iterator */
struct kref ref; /* Reference count */
+ int been_active; /* Tracing was started at least once */
};
/* Per-subbuffer commit counters used on the hot path */
*/
write_offset = v_read(config, &buf->offset);
cons_offset = atomic_long_read(&buf->consumed);
- if (write_offset != cons_offset)
+
+ /*
+ * Only print errors if the session associated with the buffer has been
+ * active, otherwise destroying an un-started session results in errors
+ * because of the un-consumed packet header present in the buffer.
+ */
+ if (chan->been_active && write_offset != cons_offset)
printk(KERN_DEBUG
"LTTng: ring buffer %s, cpu %d: "
"non-consumed data\n"
list_for_each_entry(chan_priv, &session->priv->chan, node) {
if (chan_priv->channel_type != METADATA_CHANNEL)
lib_ring_buffer_clear_quiescent_channel(chan_priv->rb_chan);
+
+ WRITE_ONCE(chan_priv->rb_chan->been_active, 1);
}
WRITE_ONCE(session->active, 1);