From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751759AbcGPOLB (ORCPT ); Sat, 16 Jul 2016 10:11:01 -0400 Received: from forwardcorp1j.cmail.yandex.net ([5.255.227.106]:60408 "EHLO forwardcorp1j.cmail.yandex.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751463AbcGPOK7 (ORCPT ); Sat, 16 Jul 2016 10:10:59 -0400 X-Greylist: delayed 472 seconds by postgrey-1.27 at vger.kernel.org; Sat, 16 Jul 2016 10:10:59 EDT Authentication-Results: smtpcorp1m.mail.yandex.net; dkim=pass header.i=@yandex-team.ru Subject: [PATCH v2 comment update] kernel/watchdog: use nmi registers snapshot in hardlockup handler From: Konstantin Khlebnikov To: Andrew Morton Cc: Jiri Kosina , linux-kernel@vger.kernel.org, stable@vger.kernel.org Date: Sat, 16 Jul 2016 17:02:38 +0300 Message-ID: <146867775835.23251.14099909949401026467.stgit@buzz> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org NMI handler doesn't call set_irq_regs(), it's set only by normal IRQ. Thus get_irq_regs() returns NULL or stale registers snapshot with IP/SP pointing to the code interrupted by IRQ which was interrupted by NMI. NULL isn't a problem: in this case watchdog calls dump_stack() and prints full stack trace including NMI. But if we're stuck in IRQ handler then NMI watchlog will print stack trace without IRQ part at all. This patch uses registers snapshot passed into NMI handler as arguments: these registers points exactly to the instruction interrupted by NMI. Signed-off-by: Konstantin Khlebnikov Fixes: 55537871ef66 ("kernel/watchdog.c: perform all-CPU backtrace in case of hard lockup") Cc: Stable # 4.4+ Cc: Jiri Kosina --- kernel/watchdog.c | 1 - 1 file changed, 1 deletion(-) diff --git a/kernel/watchdog.c b/kernel/watchdog.c index 9acb29f280ec..6d1020c03d41 100644 --- a/kernel/watchdog.c +++ b/kernel/watchdog.c @@ -344,7 +344,6 @@ static void watchdog_overflow_callback(struct perf_event *event, */ if (is_hardlockup()) { int this_cpu = smp_processor_id(); - struct pt_regs *regs = get_irq_regs(); /* only print hardlockups once */ if (__this_cpu_read(hard_watchdog_warn) == true)