]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commit - kernel/trace/ring_buffer.c
ring-buffer: Allow for rescheduling when removing pages
authorVaibhav Nagarnaik <vnagarnaik@google.com>
Fri, 7 Sep 2018 22:31:29 +0000 (15:31 -0700)
committerJuerg Haefliger <juergh@canonical.com>
Wed, 24 Jul 2019 01:50:10 +0000 (19:50 -0600)
commitff4cd648a5a3545ff8c934acad3ad5ec707fb3ae
tree4c31934d54d5fb0e050124f4ac6105713dc51efe
parentec6925c4a19674d0210f66d96ddff0c0c2ee6d89
ring-buffer: Allow for rescheduling when removing pages

BugLink: https://bugs.launchpad.net/bugs/1836287
commit 83f365554e47997ec68dc4eca3f5dce525cd15c3 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/20180907223129.71994-1-vnagarnaik@google.com
Cc: stable@vger.kernel.org
Fixes: 83f40318dab00 ("ring-buffer: Make removal of ring buffer pages atomic")
Reported-by: Jason Behmer <jbehmer@google.com>
Signed-off-by: Vaibhav Nagarnaik <vnagarnaik@google.com>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Andrea Righi <andrea.righi@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
kernel/trace/ring_buffer.c