On Fri, 20 Feb 2026 14:56:56 -0500
Steven Rostedt <[email protected]> wrote:

> On Wed, 18 Feb 2026 19:14:35 +0900
> "Masami Hiramatsu (Google)" <[email protected]> wrote:
> 
> > From: Masami Hiramatsu (Google) <[email protected]>
> > 
> > Skip invalid sub-buffers when validating the persistent ring buffer
> > instead of invalidate all ring buffers.
> 
>   instead of discarding the entire ring buffer.
> 
> 
> > 
> > If the cache data in memory fails to be synchronized during a reboot,
> > the persistent ring buffer may become partially corrupted, but other
> > sub-buffers may still contain readable event data, allowing usersto
> > recover data from the corrupted ring buffer.
> 
>                   ... contain readable event data. Only discard the
>                   subbuffers that are found to be corrupted.
> 
> > 
> > Signed-off-by: Masami Hiramatsu (Google) <[email protected]>
> > ---
> >  kernel/trace/ring_buffer.c |   22 ++++++++++++----------
> >  1 file changed, 12 insertions(+), 10 deletions(-)
> > 
> > diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
> > index d2b69221a94c..0ae2a5ad8c3e 100644
> > --- a/kernel/trace/ring_buffer.c
> > +++ b/kernel/trace/ring_buffer.c
> > @@ -2045,17 +2045,19 @@ static void rb_meta_validate_events(struct 
> > ring_buffer_per_cpu *cpu_buffer)
> >             if (ret < 0) {
> >                     pr_info("Ring buffer meta [%d] invalid buffer page\n",
> >                             cpu_buffer->cpu);
> > -                   goto invalid;
> > -           }
> > -
> > -           /* If the buffer has content, update pages_touched */
> > -           if (ret)
> > -                   local_inc(&cpu_buffer->pages_touched);
> > -
> > -           entries += ret;
> > -           entry_bytes += local_read(&head_page->page->commit);
> > -           local_set(&cpu_buffer->head_page->entries, ret);
> > +                   /* Instead of invalidate whole ring buffer, just clear 
> > this subbuffer. */
> > +                   local_set(&head_page->entries, 0);
> > +                   local_set(&head_page->page->commit, 0);
> > +                   /* TODO: commit an event to mark this is broken. */
> 
> Here's how to fix the TODO:
> 
>                       local_set(&head_page->page->commit, RB_MISSED_EVENTS);

Ah, that's a nice flag!

Thanks!

> 
> -- Steve
> 
> 
> > +           } else {
> > +                   /* If the buffer has content, update pages_touched */
> > +                   if (ret)
> > +                           local_inc(&cpu_buffer->pages_touched);
> >  
> > +                   entries += ret;
> > +                   entry_bytes += local_read(&head_page->page->commit);
> > +                   local_set(&cpu_buffer->head_page->entries, ret);
> > +           }
> >             if (head_page == cpu_buffer->commit_page)
> >                     break;
> >     }
> 
> 


-- 
Masami Hiramatsu (Google) <[email protected]>

Reply via email to