Re: [PATCH v14 5/5] ring-buffer: Add persistent ring buffer selftest
From: Google
Date: Tue Mar 31 2026 - 00:13:04 EST
On Mon, 30 Mar 2026 16:24:19 -0400
Steven Rostedt <rostedt@xxxxxxxxxxx> wrote:
> On Mon, 30 Mar 2026 21:50:27 +0900
> "Masami Hiramatsu (Google)" <mhiramat@xxxxxxxxxx> wrote:
>
> > @@ -2558,12 +2577,64 @@ static void rb_free_cpu_buffer(struct ring_buffer_per_cpu *cpu_buffer)
> > kfree(cpu_buffer);
> > }
> >
> > +#ifdef CONFIG_RING_BUFFER_PERSISTENT_INJECT
> > +static void rb_test_inject_invalid_pages(struct trace_buffer *buffer)
> > +{
> > + struct ring_buffer_per_cpu *cpu_buffer;
> > + struct ring_buffer_cpu_meta *meta;
> > + struct buffer_data_page *dpage;
> > + u32 entry_bytes = 0;
> > + unsigned long ptr;
> > + int subbuf_size;
> > + int invalid = 0;
> > + int cpu;
> > + int i;
> > +
> > + if (!(buffer->flags & RB_FL_TESTING))
> > + return;
> > +
> > + guard(preempt)();
> > + cpu = smp_processor_id();
> > +
> > + cpu_buffer = buffer->buffers[cpu];
> > + meta = cpu_buffer->ring_meta;
> > + ptr = (unsigned long)rb_subbufs_from_meta(meta);
> > + subbuf_size = meta->subbuf_size;
> > +
> > + for (i = 0; i < meta->nr_subbufs; i++) {
> > + int idx = meta->buffers[i];
> > +
> > + dpage = (void *)(ptr + idx * subbuf_size);
> > + /* Skip unused pages */
> > + if (!local_read(&dpage->commit))
> > + continue;
> > +
> > + /* Invalidate even pages. */
> > + if (!(i & 0x1)) {
> > + local_add(subbuf_size + 1, &dpage->commit);
> > + invalid++;
> > + } else {
> > + /* Count total commit bytes. */
> > + entry_bytes += local_read(&dpage->commit);
> > + }
> > + }
> > +
> > + pr_info("Inject invalidated %d pages on CPU%d, total size: %ld\n",
> > + invalid, cpu, (long)entry_bytes);
>
> This is only enabled when testing. Let's make that a pr_warn() as we really
> do want to be able to see it. And it should warn that it is invalidating pages!
> (warn as in pr_warn, it doesn't need a warn as in WARN()).
OK. Let me update it.
Thanks!
>
> -- Steve
>
>
> > + meta->nr_invalid = invalid;
> > + meta->entry_bytes = entry_bytes;
> > +}
> > +#else /* !CONFIG_RING_BUFFER_PERSISTENT_INJECT */
> > +#define rb_test_inject_invalid_pages(buffer) do { } while (0)
> > +#endif
> > +
> > /* Stop recording on a persistent buffer and flush cache if needed. */
> > static int rb_flush_buffer_cb(struct notifier_block *nb, unsigned long event, void *data)
> > {
> > struct trace_buffer *buffer = container_of(nb, struct trace_buffer, flush_nb);
> >
> > ring_buffer_record_off(buffer);
> > + rb_test_inject_invalid_pages(buffer);
> > arch_ring_buffer_flush_range(buffer->range_addr_start, buffer->range_addr_end);
> > return NOTIFY_DONE;
> > }
--
Masami Hiramatsu (Google) <mhiramat@xxxxxxxxxx>