From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754118AbdDNJdu (ORCPT ); Fri, 14 Apr 2017 05:33:50 -0400 Received: from terminus.zytor.com ([65.50.211.136]:41009 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753940AbdDNJdo (ORCPT ); Fri, 14 Apr 2017 05:33:44 -0400 Date: Fri, 14 Apr 2017 02:26:44 -0700 From: tip-bot for Josh Poimboeuf Message-ID: Cc: brgerst@gmail.com, hpa@zytor.com, bp@alien8.de, luto@kernel.org, daniel@iogearbox.net, torvalds@linux-foundation.org, peterz@infradead.org, mingo@kernel.org, davej@codemonkey.org.uk, linux-kernel@vger.kernel.org, dvlasenk@redhat.com, tglx@linutronix.de, jpoimboe@redhat.com Reply-To: jpoimboe@redhat.com, linux-kernel@vger.kernel.org, tglx@linutronix.de, dvlasenk@redhat.com, davej@codemonkey.org.uk, mingo@kernel.org, peterz@infradead.org, daniel@iogearbox.net, torvalds@linux-foundation.org, bp@alien8.de, luto@kernel.org, brgerst@gmail.com, hpa@zytor.com In-Reply-To: References: To: linux-tip-commits@vger.kernel.org Subject: [tip:x86/asm] x86/unwind: Silence entry-related warnings Git-Commit-ID: a8b7a92318b6d7779f6d8e9aa6ba0e3de01a8943 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: a8b7a92318b6d7779f6d8e9aa6ba0e3de01a8943 Gitweb: http://git.kernel.org/tip/a8b7a92318b6d7779f6d8e9aa6ba0e3de01a8943 Author: Josh Poimboeuf AuthorDate: Wed, 12 Apr 2017 13:47:12 -0500 Committer: Ingo Molnar CommitDate: Fri, 14 Apr 2017 10:20:06 +0200 x86/unwind: Silence entry-related warnings A few people have reported unwinder warnings like the following: WARNING: kernel stack frame pointer at ffffc90000fe7ff0 in rsync:1157 has bad value (null) unwind stack type:0 next_sp: (null) mask:2 graph_idx:0 ffffc90000fe7f98: ffffc90000fe7ff0 (0xffffc90000fe7ff0) ffffc90000fe7fa0: ffffffffb7000f56 (trace_hardirqs_off_thunk+0x1a/0x1c) ffffc90000fe7fa8: 0000000000000246 (0x246) ffffc90000fe7fb0: 0000000000000000 ... ffffc90000fe7fc0: 00007ffe3af639bc (0x7ffe3af639bc) ffffc90000fe7fc8: 0000000000000006 (0x6) ffffc90000fe7fd0: 00007f80af433fc5 (0x7f80af433fc5) ffffc90000fe7fd8: 00007ffe3af638e0 (0x7ffe3af638e0) ffffc90000fe7fe0: 00007ffe3af638e0 (0x7ffe3af638e0) ffffc90000fe7fe8: 00007ffe3af63970 (0x7ffe3af63970) ffffc90000fe7ff0: 0000000000000000 ... ffffc90000fe7ff8: ffffffffb7b74b9a (entry_SYSCALL_64_after_swapgs+0x17/0x4f) This warning can happen when unwinding a code path where an interrupt occurred in x86 entry code before it set up the first stack frame. Silently ignore any warnings for this case. Reported-by: Daniel Borkmann Reported-by: Dave Jones Signed-off-by: Josh Poimboeuf Acked-by: Thomas Gleixner Cc: Andy Lutomirski Cc: Borislav Petkov Cc: Brian Gerst Cc: Denys Vlasenko Cc: H. Peter Anvin Cc: Linus Torvalds Cc: Peter Zijlstra Fixes: c32c47c68a0a ("x86/unwind: Warn on bad frame pointer") Link: http://lkml.kernel.org/r/dbd6838826466a60dc23a52098185bc973ce2f1e.1492020577.git.jpoimboe@redhat.com Signed-off-by: Ingo Molnar --- arch/x86/include/asm/unwind.h | 1 + arch/x86/kernel/unwind_frame.c | 36 +++++++++++++++++++++++++++--------- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/arch/x86/include/asm/unwind.h b/arch/x86/include/asm/unwind.h index 5663425..9b10dcd 100644 --- a/arch/x86/include/asm/unwind.h +++ b/arch/x86/include/asm/unwind.h @@ -12,6 +12,7 @@ struct unwind_state { struct task_struct *task; int graph_idx; #ifdef CONFIG_FRAME_POINTER + bool got_irq; unsigned long *bp, *orig_sp; struct pt_regs *regs; unsigned long ip; diff --git a/arch/x86/kernel/unwind_frame.c b/arch/x86/kernel/unwind_frame.c index c67a059..c461135 100644 --- a/arch/x86/kernel/unwind_frame.c +++ b/arch/x86/kernel/unwind_frame.c @@ -1,6 +1,8 @@ #include #include #include +#include +#include #include #include #include @@ -72,6 +74,21 @@ static size_t regs_size(struct pt_regs *regs) return sizeof(*regs); } +static bool in_entry_code(unsigned long ip) +{ + char *addr = (char *)ip; + + if (addr >= __entry_text_start && addr < __entry_text_end) + return true; + +#if defined(CONFIG_FUNCTION_GRAPH_TRACER) || defined(CONFIG_KASAN) + if (addr >= __irqentry_text_start && addr < __irqentry_text_end) + return true; +#endif + + return false; +} + #ifdef CONFIG_X86_32 #define GCC_REALIGN_WORDS 3 #else @@ -144,6 +161,7 @@ static bool update_stack_state(struct unwind_state *state, if (regs) { frame = (unsigned long *)regs; len = regs_size(regs); + state->got_irq = true; } else { frame = next_bp; len = FRAME_HEADER_SIZE; @@ -239,16 +257,8 @@ bool unwind_next_frame(struct unwind_state *state) next_bp = (unsigned long *)READ_ONCE_TASK_STACK(state->task, *state->bp); /* Move to the next frame if it's safe: */ - if (!update_stack_state(state, next_bp)) { - /* - * Don't warn on bad regs->bp. An interrupt in entry code - * might cause a false positive warning. - */ - if (state->regs) - goto the_end; - + if (!update_stack_state(state, next_bp)) goto bad_address; - } return true; @@ -263,6 +273,13 @@ bad_address: if (state->task != current) goto the_end; + /* + * Don't warn if the unwinder got lost due to an interrupt in entry + * code before the stack was set up: + */ + if (state->got_irq && in_entry_code(state->ip)) + 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", @@ -289,6 +306,7 @@ void __unwind_start(struct unwind_state *state, struct task_struct *task, memset(state, 0, sizeof(*state)); state->task = task; + state->got_irq = (regs); /* Don't even attempt to start from user mode regs: */ if (regs && user_mode(regs)) {