Skip to content

Commit 78f7a45

Browse files
committed
ring-buffer: Have ring_buffer_iter_empty() return true when empty
I noticed that reading the snapshot file when it is empty no longer gives a status. It suppose to show the status of the snapshot buffer as well as how to allocate and use it. For example: ># cat snapshot # tracer: nop # # # * Snapshot is allocated * # # Snapshot commands: # echo 0 > snapshot : Clears and frees snapshot buffer # echo 1 > snapshot : Allocates snapshot buffer, if not already allocated. # Takes a snapshot of the main buffer. # echo 2 > snapshot : Clears snapshot buffer (but does not allocate or free) # (Doesn't have to be '2' works with any number that # is not a '0' or '1') But instead it just showed an empty buffer: ># cat snapshot # tracer: nop # # entries-in-buffer/entries-written: 0/0 #P:4 # # _-----=> irqs-off # / _----=> need-resched # | / _---=> hardirq/softirq # || / _--=> preempt-depth # ||| / delay # TASK-PID CPU# |||| TIMESTAMP FUNCTION # | | | |||| | | What happened was that it was using the ring_buffer_iter_empty() function to see if it was empty, and if it was, it showed the status. But that function was returning false when it was empty. The reason was that the iter header page was on the reader page, and the reader page was empty, but so was the buffer itself. The check only tested to see if the iter was on the commit page, but the commit page was no longer pointing to the reader page, but as all pages were empty, the buffer is also. Cc: [email protected] Fixes: 651e22f ("ring-buffer: Always reset iterator to reader page") Signed-off-by: Steven Rostedt (VMware) <[email protected]>
1 parent df62db5 commit 78f7a45

File tree

1 file changed

+14
-2
lines changed

1 file changed

+14
-2
lines changed

kernel/trace/ring_buffer.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3405,11 +3405,23 @@ EXPORT_SYMBOL_GPL(ring_buffer_iter_reset);
34053405
int ring_buffer_iter_empty(struct ring_buffer_iter *iter)
34063406
{
34073407
struct ring_buffer_per_cpu *cpu_buffer;
3408+
struct buffer_page *reader;
3409+
struct buffer_page *head_page;
3410+
struct buffer_page *commit_page;
3411+
unsigned commit;
34083412

34093413
cpu_buffer = iter->cpu_buffer;
34103414

3411-
return iter->head_page == cpu_buffer->commit_page &&
3412-
iter->head == rb_commit_index(cpu_buffer);
3415+
/* Remember, trace recording is off when iterator is in use */
3416+
reader = cpu_buffer->reader_page;
3417+
head_page = cpu_buffer->head_page;
3418+
commit_page = cpu_buffer->commit_page;
3419+
commit = rb_page_commit(commit_page);
3420+
3421+
return ((iter->head_page == commit_page && iter->head == commit) ||
3422+
(iter->head_page == reader && commit_page == head_page &&
3423+
head_page->read == commit &&
3424+
iter->head == rb_page_commit(cpu_buffer->reader_page)));
34133425
}
34143426
EXPORT_SYMBOL_GPL(ring_buffer_iter_empty);
34153427

0 commit comments

Comments
 (0)