All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vincent Donnefort <vdonnefort@google.com>
To: sashiko-reviews@lists.linux.dev
Cc: linux-trace-kernel@vger.kernel.org
Subject: Re: [PATCH v1 2/4] ring-buffer: Check remote reader page commit before meta entries
Date: Sat, 14 Nov 2026 13:46:40 +0000	[thread overview]
Message-ID: <avhmQDrQ5Y7RZc3i@google.com> (raw)
In-Reply-To: <sashiko-outbox-213147@kernel.org>

On Fri, Nov 13, 2026 at 04:03:36PM +0000, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential
> issue to consider:
> - [Medium] ring-buffer: rb_num_of_entries() underflow when commit
>   precedes meta entries
> --
> 
> commit 1d2d0e6ae01d518c30dc9986893db113c38a4caf
> Author: Vincent Donnefort <vdonnefort@google.com>
> 
> ring-buffer: Check remote reader page commit before meta entries
> 
> This commit reorders the checks in __rb_get_reader_page_from_remote() to
> inspect the current reader page commit offset before checking if
> rb_num_of_entries() is zero, and adds memory barriers pairing page::commit
> and meta::entries between simple_ring_buffer_commit() and the remote reader.
> 
> > diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
> > index 3c7aa982d43e9..f70010e2ede77 100644
> > --- a/kernel/trace/ring_buffer.c
> > +++ b/kernel/trace/ring_buffer.c
> 
> [ ... ]
> 
> > @@ -5825,8 +5823,13 @@ __rb_get_reader_page_from_remote(struct ring_buffer_per_cpu *cpu_buffer)
> >  {
> >  	struct buffer_page *new_reader, *prev_reader, *prev_head, *new_head, *last;
> >  
> > -	if (!rb_read_remote_meta_page(cpu_buffer))
> > -		return NULL;
> > +	rb_read_remote_meta_page(cpu_buffer);
> > +
> > +	/*
> > +	 * Order meta::entries read before page::commit, most likely paired with
> > +	 * simple_ring_buffer_commit().
> > +	 */
> > +	smp_rmb();
> >  
> >  	/* More to read on the reader page */
> >  	if (cpu_buffer->reader_page->read < rb_page_size(cpu_buffer->reader_page)) {
> > @@ -5835,6 +5838,9 @@ __rb_get_reader_page_from_remote(struct ring_buffer_per_cpu *cpu_buffer)
> >  		return cpu_buffer->reader_page;
> >  	}
> >  
> > +	if (!rb_num_of_entries(cpu_buffer))
> > +		return NULL;
> 
> [Severity: Medium]
> Can rb_num_of_entries() underflow to ULONG_MAX when an event is consumed in
> the window between the page->commit update and the meta->entries increment?
> 
> CPU0 (writer)                       CPU1 (reader)
> -------------                       -------------
> simple_ring_buffer_commit()
>   local_set(&page->commit, write);
>                                     ring_buffer_consume()
>                                       ...
>                                       __rb_get_reader_page_from_remote()
>                                         rb_read_remote_meta_page()
>                                           /* caches entries = N */
>                                         reader_page->read < rb_page_size()
>                                           return reader_page;
>                                       rb_advance_reader()
>                                         cpu_buffer->read++; /* N + 1 */
>   simple_rb_meta_inc(meta->entries, 1);
> 
> At this point cpu_buffer->read is N + 1 while cpu_buffer->entries is still N,
> so rb_num_of_entries() evaluates N - (N + 1) = ULONG_MAX:
> 
> kernel/trace/ring_buffer.c:rb_num_of_entries() {
> 	return local_read(&cpu_buffer->entries) -
> 		(local_read(&cpu_buffer->overrun) + cpu_buffer->read);
> }
> 
> Until rb_read_remote_meta_page() runs again, ring_buffer_entries() returns
> ULONG_MAX and ring_buffer_empty() returns false on an empty buffer (which
> also prevents trace_remote_try_unload() from unloading an idle buffer).  If
> __rb_get_reader_page_from_remote() is called again before CPU0 increments
> meta->entries, !rb_num_of_entries() evaluates to false and it proceeds to
> swap_reader_page() on an empty buffer.
> 
> -- 
> Sashiko AI review · https://sashiko.dev/#/patchset/20261113152729.837429-1-vdonnefort@google.com?part=2

This underflow can happen if ring_buffer_consume() is called directly. But
trace_remote always tests ring_buffer_empty_cpu() before calling
ring_buffer_peek() or ring_buffer_iter_peek().

-- 
Vincent

  reply	other threads:[~2026-11-14 13:46 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-13 15:27 [PATCH v1 0/4] ring-buffer: Fix remote reader page swap and memory ordering Vincent Donnefort
2026-11-13 15:27 ` [PATCH v1 1/4] ring-buffer: Skip remote reader page swap when on tail Vincent Donnefort
2026-11-13 15:27 ` [PATCH v1 2/4] ring-buffer: Check remote reader page commit before meta entries Vincent Donnefort
2026-11-13 16:03   ` sashiko-bot
2026-11-14 13:46     ` Vincent Donnefort [this message]
2026-11-13 15:27 ` [PATCH v1 3/4] ring-buffer: Order remote page commit with data and timestamp Vincent Donnefort
2026-11-13 15:34   ` sashiko-bot
2026-11-14 13:34     ` Vincent Donnefort
2026-11-13 15:27 ` [PATCH v1 4/4] ring-buffer: Increment pages_read on remote ring buffer page swap Vincent Donnefort

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=avhmQDrQ5Y7RZc3i@google.com \
    --to=vdonnefort@google.com \
    --cc=linux-trace-kernel@vger.kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.