Messages in this thread | | | Date | Fri, 7 Sep 2018 14:30:52 -0400 | From | Steven Rostedt <> | Subject | Re: [PATCH] ring-buffer: Allow for rescheduling when removing pages |
| |
On Fri, 7 Sep 2018 11:21:31 -0700 Vaibhav Nagarnaik <vnagarnaik@google.com> wrote:
> 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. Add a check for need_sched() within the loop > to prevent the system hangup. > > Reported-by: Jason Behmer <jbehmer@google.com> > Signed-off-by: Vaibhav Nagarnaik <vnagarnaik@google.com> > --- > kernel/trace/ring_buffer.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c > index 1d92d4a982fd..bc1789df7c53 100644 > --- a/kernel/trace/ring_buffer.c > +++ b/kernel/trace/ring_buffer.c > @@ -1546,6 +1546,9 @@ rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned long nr_pages) > tmp_iter_page = first_page; > > do { > + if (need_resched()) > + schedule(); > +
Hi, thanks for the patch, but the proper way to do this is to stick in:
cond_resched();
And that should solve it for you. Want to send in another patch?
-- Steve
> to_remove_page = tmp_iter_page; > rb_inc_page(cpu_buffer, &tmp_iter_page); >
| |