Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753417AbdHJQmh (ORCPT ); Thu, 10 Aug 2017 12:42:37 -0400 Received: from terminus.zytor.com ([65.50.211.136]:34975 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752843AbdHJQlu (ORCPT ); Thu, 10 Aug 2017 12:41:50 -0400 Date: Thu, 10 Aug 2017 09:36:47 -0700 From: tip-bot for Masami Hiramatsu Message-ID: Cc: linux-kernel@vger.kernel.org, mhiramat@kernel.org, tglx@linutronix.de, davem@davemloft.net, jcmvbkbc@gmail.com, hpa@zytor.com, starvik@axis.com, torvalds@linux-foundation.org, anil.s.keshavamurthy@intel.com, jesper.nilsson@axis.com, ananth@in.ibm.com, francis.deslauriers@efficios.com, mingo@kernel.org, peterz@infradead.org, chris@zankel.net, ysato@users.sourceforge.jp Reply-To: chris@zankel.net, ysato@users.sourceforge.jp, peterz@infradead.org, jesper.nilsson@axis.com, ananth@in.ibm.com, francis.deslauriers@efficios.com, mingo@kernel.org, jcmvbkbc@gmail.com, hpa@zytor.com, davem@davemloft.net, starvik@axis.com, torvalds@linux-foundation.org, anil.s.keshavamurthy@intel.com, linux-kernel@vger.kernel.org, mhiramat@kernel.org, tglx@linutronix.de In-Reply-To: <150172795654.27216.9824039077047777477.stgit@devbox> References: <150172795654.27216.9824039077047777477.stgit@devbox> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/core] kprobes/x86: Do not jump-optimize kprobes on irq entry code Git-Commit-ID: d9f5f32a7d17f4906a21ad59589853639a1328a0 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 Content-Length: 2819 Lines: 74 Commit-ID: d9f5f32a7d17f4906a21ad59589853639a1328a0 Gitweb: http://git.kernel.org/tip/d9f5f32a7d17f4906a21ad59589853639a1328a0 Author: Masami Hiramatsu AuthorDate: Thu, 3 Aug 2017 11:39:26 +0900 Committer: Ingo Molnar CommitDate: Thu, 10 Aug 2017 16:28:53 +0200 kprobes/x86: Do not jump-optimize kprobes on irq entry code Since the kernel segment registers are not prepared at the entry of irq-entry code, if a kprobe on such code is jump-optimized, accessing per-CPU variables may cause a kernel panic. However, if the kprobe is not optimized, it triggers an int3 exception and sets segment registers correctly. With this patch we check the probe-address and if it is in the irq-entry code, it prohibits optimizing such kprobes. This means we can continue probing such interrupt handlers by kprobes but it is not optimized anymore. Reported-by: Francis Deslauriers Tested-by: Francis Deslauriers Signed-off-by: Masami Hiramatsu Cc: Ananth N Mavinakayanahalli Cc: Anil S Keshavamurthy Cc: Chris Zankel Cc: David S . Miller Cc: Jesper Nilsson Cc: Linus Torvalds Cc: Max Filippov Cc: Mikael Starvik Cc: Peter Zijlstra Cc: Thomas Gleixner Cc: Yoshinori Sato Cc: linux-arch@vger.kernel.org Cc: linux-cris-kernel@axis.com Cc: mathieu.desnoyers@efficios.com Link: http://lkml.kernel.org/r/150172795654.27216.9824039077047777477.stgit@devbox Signed-off-by: Ingo Molnar --- arch/x86/kernel/kprobes/opt.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/arch/x86/kernel/kprobes/opt.c b/arch/x86/kernel/kprobes/opt.c index 69ea0bc..4f98aad 100644 --- a/arch/x86/kernel/kprobes/opt.c +++ b/arch/x86/kernel/kprobes/opt.c @@ -39,6 +39,7 @@ #include #include #include +#include #include "common.h" @@ -251,10 +252,12 @@ static int can_optimize(unsigned long paddr) /* * Do not optimize in the entry code due to the unstable - * stack handling. + * stack handling and registers setup. */ - if ((paddr >= (unsigned long)__entry_text_start) && - (paddr < (unsigned long)__entry_text_end)) + if (((paddr >= (unsigned long)__entry_text_start) && + (paddr < (unsigned long)__entry_text_end)) || + ((paddr >= (unsigned long)__irqentry_text_start) && + (paddr < (unsigned long)__irqentry_text_end))) return 0; /* Check there is enough space for a relative jump. */