ring-buffer: Optimize rb_iter_head_event()

As it is fine to perform several "peeks" of event data in the ring buffer
via the iterator before moving it forward, do not re-read the event, just
return what was read before. Otherwise, it can cause inconsistent results,
especially when testing multiple CPU buffers to interleave them.

Link: http://lkml.kernel.org/r/20200317213416.592032170@goodmis.org

Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
Steven Rostedt (VMware) 2020-03-17 17:32:29 -04:00
parent ff84c50cfb
commit 153368ce1b
1 changed files with 3 additions and 0 deletions

View File

@ -1929,6 +1929,9 @@ rb_iter_head_event(struct ring_buffer_iter *iter)
unsigned long commit; unsigned long commit;
unsigned length; unsigned length;
if (iter->head != iter->next_event)
return iter->event;
/* /*
* When the writer goes across pages, it issues a cmpxchg which * When the writer goes across pages, it issues a cmpxchg which
* is a mb(), which will synchronize with the rmb here. * is a mb(), which will synchronize with the rmb here.