tracing: A couple of fixes for 5.16
Subsystems (4)
Steven Rostedt
maintainercover tracing: A couple of fixes for 5.16
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace.git
for-next
Head SHA1: 2e6e9058d13a22a6fdd36a8c444ac71d9656003a
Jiri Olsa (1):
ftrace/direct: Fix lockup in modify_ftrace_direct_multi
Steven Rostedt (VMware) (1):
ring-buffer: Protect ring_buffer_reset() from reentrancy
----
kernel/trace/ftrace.c | 3 ++- kernel/trace/ring_buffer.c | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-)
Steven Rostedt
maintainerPATCH 1/2 ring-buffer: Protect ring_buffer_reset() from reentrancy
From: "Steven Rostedt (VMware)" <[email protected]>
The resetting of the entire ring buffer use to simply go through and reset each individual CPU buffer that had its own protection and synchronization. But this was very slow, due to performing a synchronization for each CPU. The code was reshuffled to do one disabling of all CPU buffers, followed by a single RCU synchronization, and then the resetting of each of the CPU buffers. But unfortunately, the mutex that prevented multiple occurrences of resetting the buffer was not moved to the upper function, and there is nothing to protect from it.
Take the ring buffer mutex around the global reset.
--- kernel/trace/ring_buffer.c | 5 +++++ 1 file changed, 5 insertions(+)
kernel/trace/ring_buffer.c +5 -0
@@ -5228,6 +5228,9 @@ void ring_buffer_reset(struct trace_buffer *buffer)struct ring_buffer_per_cpu *cpu_buffer;int cpu; +/* prevent another thread from changing buffer sizes */ +mutex_lock (&buffer->mutex); +for_each_buffer_cpu (buffer, cpu) { cpu_buffer = buffer->buffers[cpu];
@@ -5246,6 +5249,8 @@ void ring_buffer_reset(struct trace_buffer *buffer)atomic_dec (&cpu_buffer->record_disabled);atomic_dec (&cpu_buffer->resize_disabled); } + +mutex_unlock (&buffer->mutex); }EXPORT_SYMBOL_GPL (ring_buffer_reset);
Signature · 1 line
2.33.0
Steven Rostedt
maintainerPATCH 2/2 ftrace/direct: Fix lockup in modify_ftrace_direct_multi
In reply to Steven RostedtFrom: Jiri Olsa <[email protected]>
We can't call unregister_ftrace_function under ftrace_lock.
--- kernel/trace/ftrace.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
kernel/trace/ftrace.c +2 -1
@@ -5602,10 +5602,11 @@ int modify_ftrace_direct_multi(struct ftrace_ops *ops, unsigned long addr) } } +mutex_unlock (&ftrace_lock); +/* Removing the tmp_ops will add the updated direct callers to the functions */ unregister_ftrace_function (&tmp_ops); -mutex_unlock (&ftrace_lock); out_direct:mutex_unlock (&direct_mutex);return err;
Signature · 1 line
2.33.0