Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752766AbcDOWdU (ORCPT ); Fri, 15 Apr 2016 18:33:20 -0400 Received: from mail-ig0-f177.google.com ([209.85.213.177]:35245 "EHLO mail-ig0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752324AbcDOWdO (ORCPT ); Fri, 15 Apr 2016 18:33:14 -0400 From: Howard Cochran To: linux-kernel@vger.kernel.org Cc: Steven Rostedt , Ingo Molnar , Howard Cochran , Howard Cochran Subject: [PATCH v2 4/5] tracing: Make snapshot trigger affect the correct instance Date: Fri, 15 Apr 2016 18:32:14 -0400 Message-Id: <1460759535-22403-5-git-send-email-hcochran@kernelspring.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1460759535-22403-1-git-send-email-hcochran@kernelspring.com> References: <1460759535-22403-1-git-send-email-hcochran@kernelspring.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3709 Lines: 103 Currently, the snapshot trigger always snapshots the top level instance, even if it was triggered within an instance. Fixed by using the trace_array associated with the trace_event_file which fired the trigger. Signed-off-by: Howard Cochran --- kernel/trace/trace.c | 38 ++++++++++++++++++++++--------------- kernel/trace/trace.h | 1 + kernel/trace/trace_events_trigger.c | 2 +- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index c78fe42..e98770b 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -620,22 +620,11 @@ EXPORT_SYMBOL_GPL(__trace_bputs); #ifdef CONFIG_TRACER_SNAPSHOT /** - * trace_snapshot - take a snapshot of the current buffer. - * - * This causes a swap between the snapshot buffer and the current live - * tracing buffer. You can use this to take snapshots of the live - * trace when some condition is triggered, but continue to trace. - * - * Note, make sure to allocate the snapshot with either - * a tracing_snapshot_alloc(), or by doing it manually - * with: echo 1 > /sys/kernel/debug/tracing/snapshot - * - * If the snapshot buffer is not allocated, it will stop tracing. - * Basically making a permanent snapshot. + * trace_snapshot - take a snapshot of a buffer. + * @tr: Which tracing buffer (instance) to take a snapshot of */ -void tracing_snapshot(void) +void __tracing_snapshot(struct trace_array *tr) { - struct trace_array *tr = &global_trace; struct tracer *tracer = tr->current_trace; unsigned long flags; @@ -648,7 +637,7 @@ void tracing_snapshot(void) if (!tr->allocated_snapshot) { internal_trace_puts("*** SNAPSHOT NOT ALLOCATED ***\n"); internal_trace_puts("*** stopping trace here! ***\n"); - tracing_off(); + tracer_tracing_off(tr); return; } @@ -663,6 +652,25 @@ void tracing_snapshot(void) update_max_tr(tr, current, smp_processor_id()); local_irq_restore(flags); } + +/** + * trace_snapshot - take a snapshot of the top level buffer. + * + * This causes a swap between the snapshot buffer and the current live + * tracing buffer. You can use this to take snapshots of the live + * trace when some condition is triggered, but continue to trace. + * + * Note, make sure to allocate the snapshot with either + * a tracing_snapshot_alloc(), or by doing it manually + * with: echo 1 > /sys/kernel/debug/tracing/snapshot + * + * If the snapshot buffer is not allocated, it will stop tracing. + * Basically making a permanent snapshot. + */ +void tracing_snapshot(void) +{ + __tracing_snapshot(&global_trace); +} EXPORT_SYMBOL_GPL(tracing_snapshot); static int resize_buffer_duplicate_size(struct trace_buffer *trace_buf, diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index d3bc0e8..d98d54c 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -717,6 +717,7 @@ enum print_line_t print_trace_line(struct trace_iterator *iter); extern char trace_find_mark(unsigned long long duration); void __trace_dump_stack(int skip, struct trace_array *tr); +void __tracing_snapshot(struct trace_array *tr); int tracer_tracing_is_on(struct trace_array *tr); void tracer_tracing_on(struct trace_array *tr); void tracer_tracing_off(struct trace_array *tr); diff --git a/kernel/trace/trace_events_trigger.c b/kernel/trace/trace_events_trigger.c index 3595688..2f7dc19 100644 --- a/kernel/trace/trace_events_trigger.c +++ b/kernel/trace/trace_events_trigger.c @@ -901,7 +901,7 @@ static void snapshot_trigger(struct event_trigger_data *data, void *rec, struct trace_event_file *file) { - tracing_snapshot(); + __tracing_snapshot(file->tr); } static void -- 1.9.1