From: Zheng Yejian Date: Wed, 6 Sep 2023 08:19:30 +0000 (+0800) Subject: ring-buffer: Avoid softlockup in ring_buffer_resize() X-Git-Tag: v6.1.61~681 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=11054f0b889fbc5636c55361cb93a900633d8374;p=platform%2Fkernel%2Flinux-starfive.git ring-buffer: Avoid softlockup in ring_buffer_resize() [ Upstream commit f6bd2c92488c30ef53b5bd80c52f0a7eee9d545a ] When user resize all trace ring buffer through file 'buffer_size_kb', then in ring_buffer_resize(), kernel allocates buffer pages for each cpu in a loop. If the kernel preemption model is PREEMPT_NONE and there are many cpus and there are many buffer pages to be allocated, it may not give up cpu for a long time and finally cause a softlockup. To avoid it, call cond_resched() after each cpu buffer allocation. Link: https://lore.kernel.org/linux-trace-kernel/20230906081930.3939106-1-zhengyejian1@huawei.com Cc: Signed-off-by: Zheng Yejian Signed-off-by: Steven Rostedt (Google) Signed-off-by: Sasha Levin --- diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index de55107..42ad59a 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -2212,6 +2212,8 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size, err = -ENOMEM; goto out_err; } + + cond_resched(); } cpus_read_lock();