lkml.org 
[lkml]   [2019]   [Feb]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH v2 14/14] x86/watchdog: Add a shim hardlockup detector
    Date
    The generic hardlockup detector is based on perf. It also provides a set
    of weak stubs that CPU architectures can override. Add a shim hardlockup
    detector for x86 that selects between perf and hpet implementations.

    Specifically, this shim implementation is needed for the HPET-based
    hardlockup detector; it can also be used for future implementations.

    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Ashok Raj <ashok.raj@intel.com>
    Cc: Andi Kleen <andi.kleen@intel.com>
    Cc: Tony Luck <tony.luck@intel.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Clemens Ladisch <clemens@ladisch.de>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Philippe Ombredanne <pombredanne@nexb.com>
    Cc: Kate Stewart <kstewart@linuxfoundation.org>
    Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
    Cc: Mimi Zohar <zohar@linux.ibm.com>
    Cc: Jan Kiszka <jan.kiszka@siemens.com>
    Cc: Nick Desaulniers <ndesaulniers@google.com>
    Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
    Cc: Nayna Jain <nayna@linux.ibm.com>
    Cc: "Ravi V. Shankar" <ravi.v.shankar@intel.com>
    Cc: x86@kernel.org
    Suggested-by: Nicholas Piggin <npiggin@gmail.com>
    Signed-off-by: Ricardo Neri <ricardo.neri-calderon@linux.intel.com>
    ---
    arch/x86/Kconfig.debug | 4 ++
    arch/x86/kernel/Makefile | 1 +
    arch/x86/kernel/watchdog_hld.c | 78 ++++++++++++++++++++++++++++++++++
    3 files changed, 83 insertions(+)
    create mode 100644 arch/x86/kernel/watchdog_hld.c

    diff --git a/arch/x86/Kconfig.debug b/arch/x86/Kconfig.debug
    index 3a2845a29e8a..5e5f4d2330af 100644
    --- a/arch/x86/Kconfig.debug
    +++ b/arch/x86/Kconfig.debug
    @@ -169,10 +169,14 @@ config IOMMU_LEAK
    config HAVE_MMIOTRACE_SUPPORT
    def_bool y

    +config X86_HARDLOCKUP_DETECTOR
    + bool
    +
    config X86_HARDLOCKUP_DETECTOR_HPET
    bool "Use HPET Timer for Hard Lockup Detection"
    select SOFTLOCKUP_DETECTOR
    select HARDLOCKUP_DETECTOR
    + select X86_HARDLOCKUP_DETECTOR
    depends on HPET_TIMER && HPET && X86_64
    help
    Say y to enable a hardlockup detector that is driven by an High-
    diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
    index 9d610e8a9224..5372453fe2a7 100644
    --- a/arch/x86/kernel/Makefile
    +++ b/arch/x86/kernel/Makefile
    @@ -106,6 +106,7 @@ obj-$(CONFIG_VM86) += vm86_32.o
    obj-$(CONFIG_EARLY_PRINTK) += early_printk.o

    obj-$(CONFIG_HPET_TIMER) += hpet.o
    +obj-$(CONFIG_X86_HARDLOCKUP_DETECTOR) += watchdog_hld.o
    obj-$(CONFIG_X86_HARDLOCKUP_DETECTOR_HPET) += watchdog_hld_hpet.o
    obj-$(CONFIG_APB_TIMER) += apb_timer.o

    diff --git a/arch/x86/kernel/watchdog_hld.c b/arch/x86/kernel/watchdog_hld.c
    new file mode 100644
    index 000000000000..a2f6190dbce0
    --- /dev/null
    +++ b/arch/x86/kernel/watchdog_hld.c
    @@ -0,0 +1,78 @@
    +// SPDX-License-Identifier: GPL-2.0
    +/*
    + * A shim hardlockup detector. It simply overrides the weak stubs of the
    + * generic implementation.
    + *
    + * Copyright (C) Intel Corporation 2019
    + */
    +
    +#include <linux/nmi.h>
    +#include <asm/hpet.h>
    +
    +enum x86_hardlockup_detector {
    + X86_HARDLOCKUP_DETECTOR_PERF,
    + X86_HARDLOCKUP_DETECTOR_HPET,
    +};
    +
    +static enum __read_mostly x86_hardlockup_detector detector_type;
    +
    +int watchdog_nmi_enable(unsigned int cpu)
    +{
    + if (detector_type == X86_HARDLOCKUP_DETECTOR_PERF) {
    + hardlockup_detector_perf_enable();
    + return 0;
    + }
    +
    + if (detector_type == X86_HARDLOCKUP_DETECTOR_HPET) {
    + hardlockup_detector_hpet_enable();
    + return 0;
    + }
    +
    + return -ENODEV;
    +}
    +
    +void watchdog_nmi_disable(unsigned int cpu)
    +{
    + if (detector_type == X86_HARDLOCKUP_DETECTOR_PERF) {
    + hardlockup_detector_perf_disable();
    + return;
    + }
    +
    + if (detector_type == X86_HARDLOCKUP_DETECTOR_HPET) {
    + hardlockup_detector_hpet_disable();
    + return;
    + }
    +}
    +
    +int __init watchdog_nmi_probe(void)
    +{
    + int ret;
    +
    + /*
    + * Try first with the HPET hardlockup detector. It will only
    + * succeed if selected at build time and the nmi_watchdog
    + * command-line parameter is configured. This ensure that the
    + * perf-based detector is used by default, if selected at
    + * build time.
    + */
    + ret = hardlockup_detector_hpet_init();
    + if (!ret) {
    + detector_type = X86_HARDLOCKUP_DETECTOR_HPET;
    + return ret;
    + }
    +
    + ret = hardlockup_detector_perf_init();
    + if (!ret) {
    + detector_type = X86_HARDLOCKUP_DETECTOR_PERF;
    + return ret;
    + }
    +
    + return ret;
    +}
    +
    +void watchdog_nmi_stop(void)
    +{
    + /* Only the HPET lockup detector defines a stop function. */
    + if (detector_type == X86_HARDLOCKUP_DETECTOR_HPET)
    + hardlockup_detector_hpet_enable();
    +}
    --
    2.17.1
    \
     
     \ /
      Last update: 2019-02-27 17:06    [W:4.296 / U:0.208 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site