From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756115AbZETBJr (ORCPT ); Tue, 19 May 2009 21:09:47 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1755324AbZETBJk (ORCPT ); Tue, 19 May 2009 21:09:40 -0400 Received: from hrndva-omtalb.mail.rr.com ([71.74.56.125]:63148 "EHLO hrndva-omtalb.mail.rr.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755100AbZETBJk (ORCPT ); Tue, 19 May 2009 21:09:40 -0400 Date: Tue, 19 May 2009 21:09:40 -0400 (EDT) From: Steven Rostedt X-X-Sender: rostedt@gandalf.stny.rr.com To: LKML cc: Ingo Molnar , Frederic Weisbecker , Andrew Morton Subject: [PATCH v2][GIT PULL] tracing: add trace_stack interface In-Reply-To: Message-ID: References: User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Ingo, I rebased because I forgot to add EXPORT_SYMBOL_GPL. -- Steve Please pull the latest tip/tracing/ftrace tree, which can be found at: git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace.git tip/tracing/ftrace Steven Rostedt (1): tracing: add trace_stack interface ---- include/linux/kernel.h | 2 ++ kernel/trace/trace.c | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 0 deletions(-) --------------------------- commit 9f6b28655254b91c48f684b367ac14bfec0e180a Author: Steven Rostedt Date: Tue May 19 18:54:16 2009 -0400 tracing: add trace_stack interface This patch adds the global function void trace_stack(void) This allows a developer to find where a function is called. For example, if you want to know who calls __netif_reschedule, you can add static inline void __netif_reschedule(struct Qdisc *q) { struct softnet_data *sd; unsigned long flags; + trace_stack(); local_irq_save(flags); sd = &__get_cpu_var(softnet_data); q->next_sched = sd->output_queue; And see the following in the trace output: <= __ftrace_trace_stack <= trace_stack <= __netif_schedule <= dev_watchdog <= run_timer_softirq <= __do_softirq <= call_softirq <= do_softirq <= irq_exit Signed-off-by: Steven Rostedt diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 883cd44..347a0f1 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -511,6 +511,7 @@ extern int __ftrace_vprintk(unsigned long ip, const char *fmt, va_list ap); extern void ftrace_dump(void); +extern void trace_stack(void); #else static inline void ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3) { } @@ -531,6 +532,7 @@ ftrace_vprintk(const char *fmt, va_list ap) return 0; } static inline void ftrace_dump(void) { } +static inline void trace_stack(void) { } #endif /* CONFIG_TRACING */ /* diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index dd40d23..7bfd4f2 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -1046,6 +1046,22 @@ void __trace_stack(struct trace_array *tr, __ftrace_trace_stack(tr, flags, skip, pc); } +/** + * trace_stack - dump the stack into the trace buffer + * + * Use this to record the stack trace into the ring buffer. If you + * want to know a caller of a function, place a call to trace_stack + * and the ftrace trace file will display who the callers were. + */ +void trace_stack(void) +{ + unsigned long flags; + + local_save_flags(flags); + __trace_stack(&global_trace, flags, 0, preempt_count()); +} +EXPORT_SYMBOL_GPL(trace_stack); + static void ftrace_trace_userstack(struct trace_array *tr, unsigned long flags, int pc) {