From: Tejun Heo <tj@kernel.org>
To: linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org,
akpm@linux-foundation.org, mingo@redhat.com, x86@kernel.org
Cc: rth@twiddle.net, linux@arm.linux.org.uk, msalter@redhat.com,
starvik@axis.com, dhowells@redhat.com, tony.luck@intel.com,
benh@kernel.crashing.org, takata@linux-m32r.org,
geert@linux-m68k.org, james.hogan@imgtec.com, monstr@monstr.eu,
ralf@linux-mips.org, jonas@southpole.se, rkuo@codeaurora.org,
schwidefsky@de.ibm.com, liqin.chen@sunplusct.com,
davem@davemloft.net, lethal@linux-sh.org, vgupta@synopsys.com,
chris@zankel.net, cmetcalf@tilera.com,
ysato@users.sourceforge.jp, gxt@mprc.pku.edu.cn,
jdike@addtoit.com
Subject: [PATCH UPDATED 1/7] x86: don't show trace into stacktrace machinery
Date: Wed, 10 Apr 2013 13:10:20 -0700 [thread overview]
Message-ID: <20130410201020.GF17641@mtj.dyndns.org> (raw)
In-Reply-To: <1365016497-32033-2-git-send-email-tj@kernel.org>
From 1abcf30c5fe1ddf166bedd482b1fc7dbed164a87 Mon Sep 17 00:00:00 2001
From: Tejun Heo <tj@kernel.org>
Date: Wed, 10 Apr 2013 13:06:06 -0700
When dumping stacktrace, frames of the stacktrace code itself aren't
interesting. Implement dump_trace_current_frame() helper which can be
used by (eventual) users of dump_trace() to determine the stack and
frame pointers of the current frame so that frames beyond that point
are ignored by dump_trace().
show_stack() and save_stack_trace[_tsk]() are updated to use the
helper and now ignore frames beyond their own. This brings
show_stack(NULL, NULL)'s behavior in line with dump_stack().
Also add dump_trace_warn_current_frame() which is used by dump_trace()
implementations to whine about callers which dump %current but don't
specify the frame to dump to catch mistakes.
The original patch just updated show_stack(). Applying it to other
users and addition of warning are suggested by Ingo.
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Ingo Molnar <mingo@kernel.org>
---
save_stack_trace*() were specifying NULL %bp as well. Introduced a
helper and make both dump_stack() and save_stack_trace*() use it and
added a warning message in dump_trace().
git branch also updated. This change doesn't affect other patches in
the series other than minor offset changes.
Thanks.
arch/x86/include/asm/stacktrace.h | 35 +++++++++++++++++++++++++++++++++++
arch/x86/kernel/dumpstack.c | 11 ++++++++++-
arch/x86/kernel/dumpstack_32.c | 2 ++
arch/x86/kernel/dumpstack_64.c | 2 ++
arch/x86/kernel/stacktrace.c | 12 ++++++++++--
5 files changed, 59 insertions(+), 3 deletions(-)
diff --git a/arch/x86/include/asm/stacktrace.h b/arch/x86/include/asm/stacktrace.h
index 70bbe39..1abe898 100644
--- a/arch/x86/include/asm/stacktrace.h
+++ b/arch/x86/include/asm/stacktrace.h
@@ -73,14 +73,49 @@ stack_frame(struct task_struct *task, struct pt_regs *regs)
/* bp is the last reg pushed by switch_to */
return *(unsigned long *)task->thread.sp;
}
+
+/* sanity check helper for dump_trace(), see dump_trace_current_frame() */
+static inline void
+dump_trace_warn_current_frame(struct task_struct *task, struct pt_regs *regs,
+ unsigned long bp)
+{
+ if ((!task || task == current) && !regs && !bp)
+ printk(KERN_WARNING "dump_trace: %pf didn't specify neither frame nor regs for %%current\n",
+ __builtin_return_address(0));
+}
#else
static inline unsigned long
stack_frame(struct task_struct *task, struct pt_regs *regs)
{
return 0;
}
+
+static inline void
+dump_trace_warn_current_frame(struct task_struct *task, struct pt_regs *regs,
+ unsigned long bp)
+{ }
#endif
+/**
+ * dump_trace_current_frame - stack and frame pointers for the current frame
+ * @sp: output argument for the stack pointer
+ * @bp: output argument for the frame pointer
+ *
+ * When dumping %current, dump_trace() wants its caller to specify the top
+ * frame so that it doesn't end up showing unncessary traces into stack
+ * dumping machinery. This helper can be used to determine @sp and @bp to
+ * pass to dump_trace() when dumping %current. This functions is
+ * __always_inline so that it records the frame of the caller.
+ */
+static __always_inline
+void dump_trace_current_frame(unsigned long **sp, unsigned long *bp)
+{
+ unsigned long stack;
+
+ *sp = &stack;
+ *bp = stack_frame(current, NULL);
+}
+
extern void
show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
unsigned long *stack, unsigned long bp, char *log_lvl);
diff --git a/arch/x86/kernel/dumpstack.c b/arch/x86/kernel/dumpstack.c
index c8797d5..6e5e3ab 100644
--- a/arch/x86/kernel/dumpstack.c
+++ b/arch/x86/kernel/dumpstack.c
@@ -176,7 +176,16 @@ void show_trace(struct task_struct *task, struct pt_regs *regs,
void show_stack(struct task_struct *task, unsigned long *sp)
{
- show_stack_log_lvl(task, NULL, sp, 0, "");
+ unsigned long bp = 0;
+
+ /*
+ * Stack frames below this one aren't interesting. Don't show them
+ * if we're printing for %current.
+ */
+ if (!sp && (!task || task == current))
+ dump_trace_current_frame(&sp, &bp);
+
+ show_stack_log_lvl(task, NULL, sp, bp, "");
}
/*
diff --git a/arch/x86/kernel/dumpstack_32.c b/arch/x86/kernel/dumpstack_32.c
index 1038a41..8cc7c4a 100644
--- a/arch/x86/kernel/dumpstack_32.c
+++ b/arch/x86/kernel/dumpstack_32.c
@@ -23,6 +23,8 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
{
int graph = 0;
+ dump_trace_warn_current_frame(task, regs, bp);
+
if (!task)
task = current;
diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c
index b653675..349a8a9 100644
--- a/arch/x86/kernel/dumpstack_64.c
+++ b/arch/x86/kernel/dumpstack_64.c
@@ -123,6 +123,8 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
int graph = 0;
unsigned long dummy;
+ dump_trace_warn_current_frame(task, regs, bp);
+
if (!task)
task = current;
diff --git a/arch/x86/kernel/stacktrace.c b/arch/x86/kernel/stacktrace.c
index fdd0c64..0908a50 100644
--- a/arch/x86/kernel/stacktrace.c
+++ b/arch/x86/kernel/stacktrace.c
@@ -60,7 +60,10 @@ static const struct stacktrace_ops save_stack_ops_nosched = {
*/
void save_stack_trace(struct stack_trace *trace)
{
- dump_trace(current, NULL, NULL, 0, &save_stack_ops, trace);
+ unsigned long *sp, bp;
+
+ dump_trace_current_frame(&sp, &bp);
+ dump_trace(current, NULL, sp, bp, &save_stack_ops, trace);
if (trace->nr_entries < trace->max_entries)
trace->entries[trace->nr_entries++] = ULONG_MAX;
}
@@ -75,7 +78,12 @@ void save_stack_trace_regs(struct pt_regs *regs, struct stack_trace *trace)
void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
{
- dump_trace(tsk, NULL, NULL, 0, &save_stack_ops_nosched, trace);
+ unsigned long *sp = NULL, bp = 0;
+
+ if (!tsk || tsk == current)
+ dump_trace_current_frame(&sp, &bp);
+
+ dump_trace(tsk, NULL, sp, bp, &save_stack_ops_nosched, trace);
if (trace->nr_entries < trace->max_entries)
trace->entries[trace->nr_entries++] = ULONG_MAX;
}
--
1.8.1.4
next prev parent reply other threads:[~2013-04-10 20:10 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-03 19:14 [PATCHSET v2] arch: unify task dump debug info Tejun Heo
2013-04-03 19:14 ` [PATCH 1/7] x86: don't show trace beyond show_stack(NULL, NULL) Tejun Heo
2013-04-08 16:08 ` Ingo Molnar
2013-04-08 17:57 ` Tejun Heo
2013-04-10 10:35 ` Ingo Molnar
2013-04-10 18:54 ` Tejun Heo
2013-04-10 20:10 ` Tejun Heo [this message]
2013-04-10 20:22 ` [PATCH UPDATED 1/7] x86: don't show trace into stacktrace machinery Borislav Petkov
2013-04-10 21:09 ` Tejun Heo
2013-04-10 21:09 ` Tejun Heo
2013-04-10 21:18 ` [PATCH UPDATED v2 " Tejun Heo
2013-04-03 19:14 ` [PATCH 2/7] sparc32: make show_stack() acquire %fp if @_ksp is not specified Tejun Heo
2013-04-03 19:14 ` Tejun Heo
2013-04-03 19:14 ` [PATCH 3/7] dump_stack: consolidate dump_stack() implementations and unify their behaviors Tejun Heo
2013-04-03 19:14 ` Tejun Heo
2013-04-04 7:13 ` Martin Schwidefsky
2013-04-12 20:39 ` Chris Metcalf
2013-04-12 21:59 ` Tejun Heo
2013-04-03 19:14 ` [PATCH 4/7] dmi: morph dmi_dump_ids() into dmi_format_ids() which formats into a buffer Tejun Heo
2013-04-03 19:14 ` Tejun Heo
2013-04-03 19:14 ` [PATCH 5/7] dump_stack: implement arch-specific hardware description in task dumps Tejun Heo
2013-04-03 19:14 ` Tejun Heo
2013-04-03 19:14 ` [PATCH 6/7] dump_stack: unify debug information printed by show_regs() Tejun Heo
2013-04-03 19:14 ` Tejun Heo
2013-04-12 20:37 ` Chris Metcalf
2013-04-03 19:14 ` [PATCH 7/7] arc, print-fatal-signals: reduce duplicated information Tejun Heo
2013-04-03 19:14 ` Tejun Heo
2013-04-08 15:31 ` [PATCHSET v2] arch: unify task dump debug info Tejun Heo
2013-04-08 15:31 ` Tejun Heo
2013-04-11 18:47 ` Tejun Heo
2013-04-12 5:42 ` Ingo Molnar
2013-04-13 1:14 ` rkuo
2013-04-13 1:14 ` rkuo
2013-04-18 14:34 ` Russell King - ARM Linux
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=20130410201020.GF17641@mtj.dyndns.org \
--to=tj@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=benh@kernel.crashing.org \
--cc=chris@zankel.net \
--cc=cmetcalf@tilera.com \
--cc=davem@davemloft.net \
--cc=dhowells@redhat.com \
--cc=geert@linux-m68k.org \
--cc=gxt@mprc.pku.edu.cn \
--cc=james.hogan@imgtec.com \
--cc=jdike@addtoit.com \
--cc=jonas@southpole.se \
--cc=lethal@linux-sh.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=liqin.chen@sunplusct.com \
--cc=mingo@redhat.com \
--cc=monstr@monstr.eu \
--cc=msalter@redhat.com \
--cc=ralf@linux-mips.org \
--cc=rkuo@codeaurora.org \
--cc=rth@twiddle.net \
--cc=schwidefsky@de.ibm.com \
--cc=starvik@axis.com \
--cc=takata@linux-m32r.org \
--cc=tony.luck@intel.com \
--cc=vgupta@synopsys.com \
--cc=x86@kernel.org \
--cc=ysato@users.sourceforge.jp \
/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).