aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/stacktrace.c
diff options
context:
space:
mode:
authorJiri Slaby <jslaby@suse.cz>2018-05-18 08:47:11 +0200
committerIngo Molnar <mingo@kernel.org>2018-06-21 16:34:56 +0200
commit0c414367c04eeb00c3ebfee0b74c9e7f3b95fd62 (patch)
tree1a6ba2ef6278a56bea968a8a4ce96a80fd3487bb /arch/x86/kernel/stacktrace.c
parentx86/stacktrace: Clarify the reliable success paths (diff)
downloadlinux-dev-0c414367c04eeb00c3ebfee0b74c9e7f3b95fd62.tar.xz
linux-dev-0c414367c04eeb00c3ebfee0b74c9e7f3b95fd62.zip
x86/stacktrace: Do not fail for ORC with regs on stack
save_stack_trace_reliable now returns "non reliable" when there are kernel pt_regs on stack. This means an interrupt or exception happened somewhere down the route. It is a problem for the frame pointer unwinder, because the frame might not have been set up yet when the irq happened, so the unwinder might fail to unwind from the interrupted function. With ORC, this is not a problem, as ORC has out-of-band data. We can find ORC data even for the IP in the interrupted function and always unwind one level up reliably. So lift the check to apply only when CONFIG_FRAME_POINTER=y is enabled. Signed-off-by: Jiri Slaby <jslaby@suse.cz> Acked-by: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Andy Lutomirski <luto@kernel.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: https://lkml.kernel.org/lkml/20180518064713.26440-4-jslaby@suse.cz Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/x86/kernel/stacktrace.c')
-rw-r--r--arch/x86/kernel/stacktrace.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/arch/x86/kernel/stacktrace.c b/arch/x86/kernel/stacktrace.c
index 6acf1d5ca832..7627455047c2 100644
--- a/arch/x86/kernel/stacktrace.c
+++ b/arch/x86/kernel/stacktrace.c
@@ -106,7 +106,8 @@ __save_stack_trace_reliable(struct stack_trace *trace,
* unreliable.
*/
- return -EINVAL;
+ if (IS_ENABLED(CONFIG_FRAME_POINTER))
+ return -EINVAL;
}
addr = unwind_get_return_address(&state);