On Mon, Aug 24, 2026 at 10:53:15AM -0400, Steven Rostedt wrote:
> On Sun, 23 Aug 2026 21:09:05 +0100
> Vincent Donnefort <[email protected]> wrote:
> 
> > > > [Severity: High]
> > > > If ring_buffer_read_page() returns -EAGAIN because the subbuffer order 
> > > > was
> > > > updated but cpu_buffer->reader_page->order hasn't been updated yet, this
> > > > branches back to the again label.
> > > > 
> > > > Since the loop does not yield the CPU or call cond_resched(), could 
> > > > this cause
> > > > a hard lockup if the reader and the resize thread are on the same CPU?  
> > > 
> > > Hmm, this looks legit. We should at least have a way to break out if it
> > > loops too many times.  
> > 
> > Can this happen only on !CONFIG_PREEMPT systems?
> 
> It can happen with RT tasks as they don't yield. If this task is of higher
> priority than the one resizing, then it will loop forever even with a
> cond_resched().

Ha yes of course!

> 
> > 
> > I can add a cond_resched() here though, I believe that would make sense: if 
> > an
> > order modification is pending, writing is disabled anyway and we are about 
> > to
> > loose the stored events.
> 
> For RT tasks, cond_resched() wouldn't be enough.
> 
> > 
> > Additionally I can reduce the window where buffer::subbuf_order differs 
> > from the
> > reader page order by adding an "order" argument to __rb_allocate_pages() and
> > only set buffer::subbuf_order later in ring_buffer_subbuf_order_set().
> 
> I'm wondering if we even care if data_page->order != 
> cpu_buffer->reader_page->order
> and should change it to being a force copy instead.
> 
> If the reader_page is bigger than the dpage, and only copy what the dpage
> can hold. It would also update the read value of the reader_page which
> would allow another copy to get the rest. If the data page is bigger, then
> just copy everything.
> 
> It's not like this will happen often.
> 
> -- Steve


That sounds interesting... that would get rid of the -EAGAIN. Let me try.

Do you think it is still worth to reduce the window of discrepency between
buffer->subbuf_order and buffer_page->order?

-- 
Vincent

Reply via email to