Messages in this thread Patch in this message | | | Date | Tue, 31 Dec 2019 03:58:22 -0500 | From | "Frank A. Cancio Bello" <> | Subject | [PATCH] tracing: Resets the trace buffer after a snapshot |
| |
Currently, when a snapshot is taken the trace_buffer and the max_buffer are swapped. After this swap, the "new" trace_buffer is not reset. This produces an odd behavior: after a snapshot is taken the previous snapshot entries become available to the next reader of the trace_buffer as far as the reading occurs before the buffer is refilled with new entries by a writer.
This patch resets the trace buffer after a snapshot is taken.
Signed-off-by: Frank A. Cancio Bello <frank@generalsoftwareinc.com> ---
The following commands illustrate this odd behavior:
# cd /sys/kernel/debug/tracing # echo nop > current_tracer # echo 1 > tracing_on # echo m1 > trace_marker # echo 1 > snapshot # echo m2 > trace_marker # echo 1 > snapshot # cat trace # tracer: nop # # entries-in-buffer/entries-written: 1/1 #P:2 # # _-----=> irqs-off # / _----=> need-resched # | / _---=> hardirq/softirq # || / _--=> preempt-depth # ||| / delay # TASK-PID CPU# |||| TIMESTAMP FUNCTION # | | | |||| | | bash-550 [000] .... 50.479755: tracing_mark_write: m1
kernel/trace/trace.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index ddb7e7f5fe8d..58373b5ae0cf 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -6867,10 +6867,13 @@ tracing_snapshot_write(struct file *filp, const char __user *ubuf, size_t cnt, break; local_irq_disable(); /* Now, we're going to swap */ - if (iter->cpu_file == RING_BUFFER_ALL_CPUS) + if (iter->cpu_file == RING_BUFFER_ALL_CPUS) { update_max_tr(tr, current, smp_processor_id(), NULL); - else + tracing_reset_online_cpus(&tr->trace_buffer); + } else { update_max_tr_single(tr, current, iter->cpu_file); + tracing_reset_cpu(&tr->trace_buffer, iter->cpu_file); + } local_irq_enable(); break; default: -- 2.17.1
| |