From: Frederic Weisbecker <fweisbec@gmail.com>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: LKML <linux-kernel@vger.kernel.org>, Ingo Molnar <mingo@elte.hu>,
Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH][GIT PULL] tracing: add trace_stack interface
Date: Wed, 20 May 2009 03:55:02 +0200 [thread overview]
Message-ID: <20090520015501.GI6066@nowhere> (raw)
In-Reply-To: <alpine.DEB.2.00.0905192112090.7816@gandalf.stny.rr.com>
On Tue, May 19, 2009 at 09:14:13PM -0400, Steven Rostedt wrote:
>
> On Wed, 20 May 2009, Frederic Weisbecker wrote:
>
> > On Tue, May 19, 2009 at 08:44:50PM -0400, Steven Rostedt wrote:
> > >
> > > Ingo,
> > >
> > > 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 | 15 +++++++++++++++
> > > 2 files changed, 17 insertions(+), 0 deletions(-)
> > > ---------------------------
> > > commit b85d1029ba534376d203c3ac83a2e5a4d6876cb6
> > > Author: Steven Rostedt <srostedt@redhat.com>
> > > 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
> >
> >
> >
> > I guess the depth should begin here :-)
>
> Yeah, I thought about that but since it only prints out the stack trace,
> this is sorta the "this is a stack trace" header.
Indeed :)
> >
> >
> >
> > > <= __netif_schedule
> > > <= dev_watchdog
> > > <= run_timer_softirq
> > > <= __do_softirq
> > > <= call_softirq
> > > <= do_softirq
> > > <= irq_exit
> > >
> > > Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
> > >
> > > 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..33ab502 100644
> > > --- a/kernel/trace/trace.c
> > > +++ b/kernel/trace/trace.c
> > > @@ -1046,6 +1046,21 @@ 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());
> > > +}
> >
> >
> >
> > Stupidly I use a very similar patch while working on reiserfs
> > but I forgot to post it.
> >
> > Another trick is to use trace_printk() combined with:
> >
> > echo stacktrace > trace_option
>
> Yeah, but when you are debugging development work, doing that at every
> boot up becomes a pain. You can add it to a rc script but still.
Right!
> I wrote this because of the development I'm doing in the interrupt
> threads. I was using this a lot to find what is calling what.
>
> -- Steve
>
next prev parent reply other threads:[~2009-05-20 1:55 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-20 0:44 [PATCH][GIT PULL] tracing: add trace_stack interface Steven Rostedt
2009-05-20 1:07 ` Frederic Weisbecker
2009-05-20 1:14 ` Steven Rostedt
2009-05-20 1:55 ` Frederic Weisbecker [this message]
2009-05-20 1:09 ` [PATCH v2][GIT " Steven Rostedt
2009-06-03 21:48 ` Frederic Weisbecker
2009-06-03 22:18 ` Steven Rostedt
2009-06-04 11:53 ` Ingo Molnar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090520015501.GI6066@nowhere \
--to=fweisbec@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=rostedt@goodmis.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).