From: Josh Poimboeuf <jpoimboe@redhat.com>
To: x86@kernel.org
Cc: linux-kernel@vger.kernel.org,
Peter Zijlstra <peterz@infradead.org>,
Vince Weaver <vincent.weaver@maine.edu>, Dave Jones <dsj@fb.com>,
Jann Horn <jannh@google.com>, Miroslav Benes <mbenes@suse.cz>,
Andy Lutomirski <luto@kernel.org>,
Steven Rostedt <rostedt@goodmis.org>,
Thomas Gleixner <tglx@linutronix.de>
Subject: [PATCH 08/14] x86/unwind: Prevent false warnings for non-current tasks
Date: Thu, 12 Mar 2020 12:30:27 -0500 [thread overview]
Message-ID: <beea5c90c04d744986b7bee54390f238ae4eabda.1584033751.git.jpoimboe@redhat.com> (raw)
In-Reply-To: <cover.1584033751.git.jpoimboe@redhat.com>
There's some daring kernel code out there which dumps the stack of
another task without first making sure the task is inactive. If the
task happens to be running while the unwinder is reading the stack,
unusual unwinder warnings can result.
There's no race-free way for the unwinder to know whether such a warning
is legitimate, so just disable unwinder warnings for all non-current
tasks.
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
---
arch/x86/kernel/dumpstack_64.c | 3 ++-
arch/x86/kernel/unwind_frame.c | 3 +++
arch/x86/kernel/unwind_orc.c | 40 +++++++++++++++++++---------------
3 files changed, 28 insertions(+), 18 deletions(-)
diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c
index 87b97897a881..460ae7f66818 100644
--- a/arch/x86/kernel/dumpstack_64.c
+++ b/arch/x86/kernel/dumpstack_64.c
@@ -183,7 +183,8 @@ int get_stack_info(unsigned long *stack, struct task_struct *task,
*/
if (visit_mask) {
if (*visit_mask & (1UL << info->type)) {
- printk_deferred_once(KERN_WARNING "WARNING: stack recursion on stack type %d\n", info->type);
+ if (task == current)
+ printk_deferred_once(KERN_WARNING "WARNING: stack recursion on stack type %d\n", info->type);
goto unknown;
}
*visit_mask |= 1UL << info->type;
diff --git a/arch/x86/kernel/unwind_frame.c b/arch/x86/kernel/unwind_frame.c
index a224b5ab103f..54226110bc7f 100644
--- a/arch/x86/kernel/unwind_frame.c
+++ b/arch/x86/kernel/unwind_frame.c
@@ -344,6 +344,9 @@ bool unwind_next_frame(struct unwind_state *state)
if (IS_ENABLED(CONFIG_X86_32))
goto the_end;
+ if (state->task != current)
+ goto the_end;
+
if (state->regs) {
printk_deferred_once(KERN_WARNING
"WARNING: kernel stack regs at %p in %s:%d has bad 'bp' value %p\n",
diff --git a/arch/x86/kernel/unwind_orc.c b/arch/x86/kernel/unwind_orc.c
index 64889da666f4..45166fd50be3 100644
--- a/arch/x86/kernel/unwind_orc.c
+++ b/arch/x86/kernel/unwind_orc.c
@@ -8,7 +8,13 @@
#include <asm/orc_lookup.h>
#define orc_warn(fmt, ...) \
- printk_deferred_once(KERN_WARNING pr_fmt("WARNING: " fmt), ##__VA_ARGS__)
+ printk_deferred_once(KERN_WARNING "WARNING: " fmt, ##__VA_ARGS__)
+
+#define orc_warn_current(args...) \
+({ \
+ if (state->task == current) \
+ orc_warn(args); \
+})
extern int __start_orc_unwind_ip[];
extern int __stop_orc_unwind_ip[];
@@ -446,8 +452,8 @@ bool unwind_next_frame(struct unwind_state *state)
case ORC_REG_R10:
if (!state->regs || !state->full_regs) {
- orc_warn("missing regs for base reg R10 at ip %pB\n",
- (void *)state->ip);
+ orc_warn_current("missing R10 value at %pB\n",
+ (void *)state->ip);
goto err;
}
sp = state->regs->r10;
@@ -455,8 +461,8 @@ bool unwind_next_frame(struct unwind_state *state)
case ORC_REG_R13:
if (!state->regs || !state->full_regs) {
- orc_warn("missing regs for base reg R13 at ip %pB\n",
- (void *)state->ip);
+ orc_warn_current("missing R13 value at %pB\n",
+ (void *)state->ip);
goto err;
}
sp = state->regs->r13;
@@ -464,8 +470,8 @@ bool unwind_next_frame(struct unwind_state *state)
case ORC_REG_DI:
if (!state->regs || !state->full_regs) {
- orc_warn("missing regs for base reg DI at ip %pB\n",
- (void *)state->ip);
+ orc_warn_current("missing RDI value at %pB\n",
+ (void *)state->ip);
goto err;
}
sp = state->regs->di;
@@ -473,15 +479,15 @@ bool unwind_next_frame(struct unwind_state *state)
case ORC_REG_DX:
if (!state->regs || !state->full_regs) {
- orc_warn("missing regs for base reg DX at ip %pB\n",
- (void *)state->ip);
+ orc_warn_current("missing DX value at %pB\n",
+ (void *)state->ip);
goto err;
}
sp = state->regs->dx;
break;
default:
- orc_warn("unknown SP base reg %d for ip %pB\n",
+ orc_warn("unknown SP base reg %d at %pB\n",
orc->sp_reg, (void *)state->ip);
goto err;
}
@@ -509,8 +515,8 @@ bool unwind_next_frame(struct unwind_state *state)
case ORC_TYPE_REGS:
if (!deref_stack_regs(state, sp, &state->ip, &state->sp)) {
- orc_warn("can't dereference registers at %p for ip %pB\n",
- (void *)sp, (void *)orig_ip);
+ orc_warn_current("can't access registers at %pB\n",
+ (void *)orig_ip);
goto err;
}
@@ -521,8 +527,8 @@ bool unwind_next_frame(struct unwind_state *state)
case ORC_TYPE_REGS_IRET:
if (!deref_stack_iret_regs(state, sp, &state->ip, &state->sp)) {
- orc_warn("can't dereference iret registers at %p for ip %pB\n",
- (void *)sp, (void *)orig_ip);
+ orc_warn_current("can't access iret registers at %pB\n",
+ (void *)orig_ip);
goto err;
}
@@ -532,7 +538,7 @@ bool unwind_next_frame(struct unwind_state *state)
break;
default:
- orc_warn("unknown .orc_unwind entry type %d for ip %pB\n",
+ orc_warn("unknown .orc_unwind entry type %d at %pB\n",
orc->type, (void *)orig_ip);
break;
}
@@ -564,8 +570,8 @@ bool unwind_next_frame(struct unwind_state *state)
if (state->stack_info.type == prev_type &&
on_stack(&state->stack_info, (void *)state->sp, sizeof(long)) &&
state->sp <= prev_sp) {
- orc_warn("stack going in the wrong direction? ip=%pB\n",
- (void *)orig_ip);
+ orc_warn_current("stack going in the wrong direction? at %pB\n",
+ (void *)orig_ip);
goto err;
}
--
2.21.1
next prev parent reply other threads:[~2020-03-12 17:31 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-12 17:30 [PATCH 00/14] x86/unwind/orc: ORC fixes Josh Poimboeuf
2020-03-12 17:30 ` [PATCH 01/14] x86/dumpstack: Add SHOW_REGS_IRET mode Josh Poimboeuf
2020-03-13 11:10 ` Miroslav Benes
2020-03-12 17:30 ` [PATCH 02/14] objtool: Fix stack offset tracking for indirect CFAs Josh Poimboeuf
2020-03-12 17:30 ` [PATCH 03/14] x86/entry/64: Fix unwind hints in register clearing code Josh Poimboeuf
2020-03-12 19:29 ` Andy Lutomirski
2020-03-12 19:57 ` Josh Poimboeuf
2020-03-12 20:07 ` Peter Zijlstra
2020-03-12 21:24 ` Jann Horn
2020-03-12 17:30 ` [PATCH 04/14] x86/entry/64: Fix unwind hints in kernel exit path Josh Poimboeuf
2020-03-12 17:30 ` [PATCH 05/14] x86/entry/64: Fix unwind hints in __switch_to_asm() Josh Poimboeuf
2020-03-12 17:30 ` [PATCH 06/14] x86/entry/64: Fix unwind hints in rewind_stack_do_exit() Josh Poimboeuf
2020-03-12 17:30 ` [PATCH 07/14] x86/unwind/orc: Convert global variables to static Josh Poimboeuf
2020-03-12 17:30 ` Josh Poimboeuf [this message]
2020-03-12 17:30 ` [PATCH 09/14] x86/unwind/orc: Don't skip the first frame for inactive tasks Josh Poimboeuf
2020-03-12 17:30 ` [PATCH 10/14] x86/unwind/orc: Prevent unwinding before ORC initialization Josh Poimboeuf
2020-03-13 12:24 ` Miroslav Benes
2020-03-12 17:30 ` [PATCH 11/14] x86/unwind/orc: Fix error path for bad ORC entry type Josh Poimboeuf
2020-03-12 17:30 ` [PATCH 12/14] x86/unwind/orc: Fix premature unwind stoppage due to IRET frames Josh Poimboeuf
2020-03-12 17:30 ` [PATCH 13/14] x86/unwind/orc: Add more unwinder warnings Josh Poimboeuf
2020-03-12 19:12 ` Jann Horn
2020-03-12 19:20 ` Josh Poimboeuf
2020-03-12 17:30 ` [PATCH 14/14] x86/unwind/orc: Add 'unwind_debug' cmdline option Josh Poimboeuf
2020-03-12 19:15 ` [PATCH 00/14] x86/unwind/orc: ORC fixes Peter Zijlstra
2020-03-13 14:00 ` Miroslav Benes
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=beea5c90c04d744986b7bee54390f238ae4eabda.1584033751.git.jpoimboe@redhat.com \
--to=jpoimboe@redhat.com \
--cc=dsj@fb.com \
--cc=jannh@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mbenes@suse.cz \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
--cc=vincent.weaver@maine.edu \
--cc=x86@kernel.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
all inboxes | Powered by JetHome®