On Wed, 20 May 2026 14:49:47 -0400 Steven Rostedt <[email protected]> wrote:
> From: Steven Rostedt <[email protected]> > > When the persistent ring buffer is validated on boot up, if a subbuffer is > deemed invalid, it resets the buffer and continues. Currently, these lost > events are not shown in the trace file output. > > Have the trace iterator look for subbuffers that have the RB_MISSED_EVENTS > set and set the iter->missed_events flag when it is detected. This will > then have the trace file shows "LOST EVENTS" when it reads across a > subbuffer that was corrupted and invalidated. I think it is good to show the dropped events. BTW, is it better to comment out the line, just for parser? For example, add a '#' at the like. # CPU:5 [LOST EVENTS] Ah, but it is already done... Thanks, > > For example: > > <...>-1016 [005] ...1. 6230.660403: preempt_disable: > caller=__mod_memcg_state+0x1c8/0x200 parent=__mod_memcg_state+0x1c8/0x200 > CPU:5 [LOST EVENTS] > <...>-1016 [005] ..... 6230.660673: kmem_cache_alloc: > call_site=__anon_vma_prepare+0x1ad/0x1e0 ptr=000000006e40294c name=anon_vma > bytes_req=200 bytes_alloc=208 gfp_flags=GFP_KERNEL node=-1 accounted=true > > Signed-off-by: Steven Rostedt <[email protected]> > --- > kernel/trace/ring_buffer.c | 14 +++++++++++--- > 1 file changed, 11 insertions(+), 3 deletions(-) > > diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c > index ae5c645b59c9..9cdbee171cdc 100644 > --- a/kernel/trace/ring_buffer.c > +++ b/kernel/trace/ring_buffer.c > @@ -3518,6 +3518,9 @@ static void rb_inc_iter(struct ring_buffer_iter *iter) > else > rb_inc_page(&iter->head_page); > > + if (rb_page_commit(iter->head_page) & RB_MISSED_EVENTS) > + iter->missed_events = -1; > + > iter->page_stamp = iter->read_stamp = iter->head_page->page->time_stamp; > iter->head = 0; > iter->next_event = 0; > @@ -5579,6 +5582,7 @@ static void rb_iter_reset(struct ring_buffer_iter *iter) > iter->head_page = cpu_buffer->reader_page; > iter->head = cpu_buffer->reader_page->read; > iter->next_event = iter->head; > + iter->missed_events = 0; > > iter->cache_reader_page = iter->head_page; > iter->cache_read = cpu_buffer->read; > @@ -7053,7 +7057,7 @@ int ring_buffer_read_page(struct trace_buffer *buffer, > struct ring_buffer_event *event; > struct buffer_data_page *dpage; > struct buffer_page *reader; > - unsigned long missed_events; > + long missed_events; > unsigned int commit; > unsigned int read; > u64 save_timestamp; > @@ -7179,6 +7183,8 @@ int ring_buffer_read_page(struct trace_buffer *buffer, > local_set(&reader->entries, 0); > reader->read = 0; > data_page->data = dpage; > + if (!missed_events && rb_data_page_commit(dpage) & > RB_MISSED_EVENTS) > + missed_events = -1; > > /* > * Use the real_end for the data size, > @@ -7196,10 +7202,12 @@ int ring_buffer_read_page(struct trace_buffer *buffer, > * Set a flag in the commit field if we lost events > */ > if (missed_events) { > - /* If there is room at the end of the page to save the > + /* > + * If there is room at the end of the page to save the > * missed events, then record it there. > */ > - if (buffer->subbuf_size - commit >= sizeof(missed_events)) { > + if (missed_events > 0 && > + buffer->subbuf_size - commit >= sizeof(missed_events)) { > memcpy(&dpage->data[commit], &missed_events, > sizeof(missed_events)); > local_add(RB_MISSED_STORED, &dpage->commit); > -- > 2.53.0 > > -- Masami Hiramatsu (Google) <[email protected]>
