Message ID | 20240312115641.6aa8ba08@gandalf.local.home (mailing list archive) |
---|---|
State | Accepted |
Commit | 761d9473e27f0c8782895013a3e7b52a37c8bcfc |
Headers | show |
Series | ring-buffer: Do not set shortest_full when full target is hit | expand |
On Tue, 12 Mar 2024 11:56:41 -0400 Steven Rostedt <rostedt@goodmis.org> wrote: > From: "Steven Rostedt (Google)" <rostedt@goodmis.org> > > The rb_watermark_hit() checks if the amount of data in the ring buffer is > above the percentage level passed in by the "full" variable. If it is, it > returns true. > > But it also sets the "shortest_full" field of the cpu_buffer that informs > writers that it needs to call the irq_work if the amount of data on the > ring buffer is above the requested amount. > > The rb_watermark_hit() always sets the shortest_full even if the amount in > the ring buffer is what it wants. As it is not going to wait, because it > has what it wants, there's no reason to set shortest_full. > Yeah, it should avoid setting if !ret. Looks good to me. Reviewed-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> Thank you, > Cc: stable@vger.kernel.org > Fixes: 42fb0a1e84ff5 ("tracing/ring-buffer: Have polling block on watermark") > Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org> > --- > kernel/trace/ring_buffer.c | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c > index 9b887d44b8d9..350607cce869 100644 > --- a/kernel/trace/ring_buffer.c > +++ b/kernel/trace/ring_buffer.c > @@ -834,9 +834,10 @@ static bool rb_watermark_hit(struct trace_buffer *buffer, int cpu, int full) > pagebusy = cpu_buffer->reader_page == cpu_buffer->commit_page; > ret = !pagebusy && full_hit(buffer, cpu, full); > > - if (!cpu_buffer->shortest_full || > - cpu_buffer->shortest_full > full) > - cpu_buffer->shortest_full = full; > + if (!ret && (!cpu_buffer->shortest_full || > + cpu_buffer->shortest_full > full)) { > + cpu_buffer->shortest_full = full; > + } > raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); > } > return ret; > -- > 2.43.0 >
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 9b887d44b8d9..350607cce869 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -834,9 +834,10 @@ static bool rb_watermark_hit(struct trace_buffer *buffer, int cpu, int full) pagebusy = cpu_buffer->reader_page == cpu_buffer->commit_page; ret = !pagebusy && full_hit(buffer, cpu, full); - if (!cpu_buffer->shortest_full || - cpu_buffer->shortest_full > full) - cpu_buffer->shortest_full = full; + if (!ret && (!cpu_buffer->shortest_full || + cpu_buffer->shortest_full > full)) { + cpu_buffer->shortest_full = full; + } raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); } return ret;