On Mon, 30 Mar 2026 16:24:19 -0400
Steven Rostedt <[email protected]> wrote:

> On Mon, 30 Mar 2026 21:50:27 +0900
> "Masami Hiramatsu (Google)" <[email protected]> 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) <[email protected]>

Reply via email to