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]>
