Skip to contentSkip to conversation

tracing: A couple of fixes for 5.16

PATCH New Steven Rostedt 1 participant 3 messages Nov 11, 2021

Subsystems (4)
lore
Share & tools
lore

Steven Rostedt

author maintainer
#0 lore raw

cover 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(-)
author maintainer
#1 lore raw

PATCH 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.

Fixes b23d7a5f4a07a ("ring-buffer: speed up buffer resets by avoiding synchronize_rcu for each CPU")
---
 kernel/trace/ring_buffer.c | 5 +++++
 1 file changed, 5 insertions(+)
kernel/trace/ring_buffer.c +5 -0
index f6520d0a4c8c..2699e9e562b1 100644
@@ -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
author maintainer
#2 lore raw

PATCH 2/2 ftrace/direct: Fix lockup in modify_ftrace_direct_multi

In reply to Steven Rostedt

From: Jiri Olsa <[email protected]>

We can't call unregister_ftrace_function under ftrace_lock.

Fixes ed29271894aa ("ftrace/direct: Do not disable when switching direct callers")
---
 kernel/trace/ftrace.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
kernel/trace/ftrace.c +2 -1
index b4ed1a301232..fc49e8809a56 100644
@@ -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