Skip to content

Commit

Permalink
ring-buffer: Allow for rescheduling when removing pages
Browse files Browse the repository at this point in the history
commit 83f3655 upstream.

When reducing ring buffer size, pages are removed by scheduling a work
item on each CPU for the corresponding CPU ring buffer. After the pages
are removed from ring buffer linked list, the pages are free()d in a
tight loop. The loop does not give up CPU until all pages are removed.
In a worst case behavior, when lot of pages are to be freed, it can
cause system stall.

After the pages are removed from the list, the free() can happen while
the work is rescheduled. Call cond_resched() in the loop to prevent the
system hangup.

Link: http://lkml.kernel.org/r/[email protected]

Cc: [email protected]
Fixes: 83f4031 ("ring-buffer: Make removal of ring buffer pages atomic")
Reported-by: Jason Behmer <[email protected]>
Signed-off-by: Vaibhav Nagarnaik <[email protected]>
Signed-off-by: Steven Rostedt (VMware) <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
vnagarnaik authored and gregkh committed Sep 29, 2018
1 parent 0e5cdba commit 7eba38a
Showing 1 changed file with 2 additions and 0 deletions.
2 changes: 2 additions & 0 deletions kernel/trace/ring_buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -1479,6 +1479,8 @@ rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned long nr_pages)
tmp_iter_page = first_page;

do {
cond_resched();

to_remove_page = tmp_iter_page;
rb_inc_page(cpu_buffer, &tmp_iter_page);

Expand Down

0 comments on commit 7eba38a

Please sign in to comment.