From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752070AbdINKrW (ORCPT ); Thu, 14 Sep 2017 06:47:22 -0400 Received: from terminus.zytor.com ([65.50.211.136]:46157 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751897AbdINKqg (ORCPT ); Thu, 14 Sep 2017 06:46:36 -0400 Date: Thu, 14 Sep 2017 03:40:00 -0700 From: tip-bot for Peter Zijlstra Message-ID: Cc: tglx@linutronix.de, bp@alien8.de, npiggin@gmail.com, mingo@kernel.org, peterz@infradead.org, uobergfe@redhat.com, cmetcalf@mellanox.com, linux-kernel@vger.kernel.org, bigeasy@linutronix.de, dzickus@redhat.com, torvalds@linux-foundation.org, hpa@zytor.com, akpm@linux-foundation.org Reply-To: akpm@linux-foundation.org, torvalds@linux-foundation.org, hpa@zytor.com, dzickus@redhat.com, bigeasy@linutronix.de, linux-kernel@vger.kernel.org, uobergfe@redhat.com, cmetcalf@mellanox.com, peterz@infradead.org, mingo@kernel.org, npiggin@gmail.com, tglx@linutronix.de, bp@alien8.de In-Reply-To: <20170912194146.167649596@linutronix.de> References: <20170912194146.167649596@linutronix.de> To: linux-tip-commits@vger.kernel.org Subject: [tip:core/urgent] watchdog/hardlockup: Provide interface to stop/restart perf events Git-Commit-ID: d0b6e0a8ef24b1b07078ababe5d91bcdf4f4264a 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: d0b6e0a8ef24b1b07078ababe5d91bcdf4f4264a Gitweb: http://git.kernel.org/tip/d0b6e0a8ef24b1b07078ababe5d91bcdf4f4264a Author: Peter Zijlstra AuthorDate: Tue, 12 Sep 2017 21:36:55 +0200 Committer: Ingo Molnar CommitDate: Thu, 14 Sep 2017 11:41:03 +0200 watchdog/hardlockup: Provide interface to stop/restart perf events Provide an interface to stop and restart perf NMI watchdog events on all CPUs. This is only usable during init and especially for handling the perf HT bug on Intel machines. It's safe to use it this way as nothing can start/stop the NMI watchdog in parallel. Signed-off-by: Peter Zijlstra Signed-off-by: Thomas Gleixner Reviewed-by: Don Zickus Cc: Andrew Morton Cc: Borislav Petkov Cc: Chris Metcalf Cc: Linus Torvalds Cc: Nicholas Piggin Cc: Sebastian Siewior Cc: Ulrich Obergfell Link: http://lkml.kernel.org/r/20170912194146.167649596@linutronix.de Signed-off-by: Ingo Molnar --- include/linux/nmi.h | 4 ++++ kernel/watchdog_hld.c | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/include/linux/nmi.h b/include/linux/nmi.h index a36abe2..b24d4a5 100644 --- a/include/linux/nmi.h +++ b/include/linux/nmi.h @@ -75,7 +75,11 @@ static inline void hardlockup_detector_disable(void) {} #if defined(CONFIG_HARDLOCKUP_DETECTOR_PERF) extern void arch_touch_nmi_watchdog(void); +extern void hardlockup_detector_perf_stop(void); +extern void hardlockup_detector_perf_restart(void); #else +static inline void hardlockup_detector_perf_stop(void) { } +static inline void hardlockup_detector_perf_restart(void) { } #if !defined(CONFIG_HAVE_NMI_WATCHDOG) static inline void arch_touch_nmi_watchdog(void) {} #endif diff --git a/kernel/watchdog_hld.c b/kernel/watchdog_hld.c index 3a09ea1..c9586eb 100644 --- a/kernel/watchdog_hld.c +++ b/kernel/watchdog_hld.c @@ -261,3 +261,44 @@ void watchdog_nmi_disable(unsigned int cpu) firstcpu_err = 0; } } + +/** + * hardlockup_detector_perf_stop - Globally stop watchdog events + * + * Special interface for x86 to handle the perf HT bug. + */ +void __init hardlockup_detector_perf_stop(void) +{ + int cpu; + + lockdep_assert_cpus_held(); + + for_each_online_cpu(cpu) { + struct perf_event *event = per_cpu(watchdog_ev, cpu); + + if (event) + perf_event_disable(event); + } +} + +/** + * hardlockup_detector_perf_restart - Globally restart watchdog events + * + * Special interface for x86 to handle the perf HT bug. + */ +void __init hardlockup_detector_perf_restart(void) +{ + int cpu; + + lockdep_assert_cpus_held(); + + if (!(watchdog_enabled & NMI_WATCHDOG_ENABLED)) + return; + + for_each_online_cpu(cpu) { + struct perf_event *event = per_cpu(watchdog_ev, cpu); + + if (event) + perf_event_enable(event); + } +}