lkml.org 
[lkml]   [2022]   [May]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 18/29] watchdog/hardlockup: Define a generic function to detect hardlockups
    Date
    The procedure to detect hardlockups is independent of the underlying
    mechanism that generates the non-maskable interrupt used to drive the
    detector. Thus, it can be put in a separate, generic function. In this
    manner, it can be invoked by various implementations of the NMI watchdog.

    For this purpose, move the bulk of watchdog_overflow_callback() to the
    new function inspect_for_hardlockups(). This function can then be called
    from the applicable NMI handlers. No functional changes.

    Cc: Andi Kleen <ak@linux.intel.com>
    Cc: Nicholas Piggin <npiggin@gmail.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Stephane Eranian <eranian@google.com>
    Cc: "Ravi V. Shankar" <ravi.v.shankar@intel.com>
    Cc: iommu@lists.linux-foundation.org
    Cc: linuxppc-dev@lists.ozlabs.org
    Cc: x86@kernel.org
    Reviewed-by: Tony Luck <tony.luck@intel.com>
    Signed-off-by: Ricardo Neri <ricardo.neri-calderon@linux.intel.com>
    ---
    Changes since v5:
    * None

    Changes since v4:
    * None

    Changes since v3:
    * None

    Changes since v2:
    * None

    Changes since v1:
    * None
    ---
    include/linux/nmi.h | 1 +
    kernel/watchdog_hld.c | 18 +++++++++++-------
    2 files changed, 12 insertions(+), 7 deletions(-)

    diff --git a/include/linux/nmi.h b/include/linux/nmi.h
    index 750c7f395ca9..1b68f48ad440 100644
    --- a/include/linux/nmi.h
    +++ b/include/linux/nmi.h
    @@ -207,6 +207,7 @@ int proc_nmi_watchdog(struct ctl_table *, int , void *, size_t *, loff_t *);
    int proc_soft_watchdog(struct ctl_table *, int , void *, size_t *, loff_t *);
    int proc_watchdog_thresh(struct ctl_table *, int , void *, size_t *, loff_t *);
    int proc_watchdog_cpumask(struct ctl_table *, int, void *, size_t *, loff_t *);
    +void inspect_for_hardlockups(struct pt_regs *regs);

    #ifdef CONFIG_HAVE_ACPI_APEI_NMI
    #include <asm/nmi.h>
    diff --git a/kernel/watchdog_hld.c b/kernel/watchdog_hld.c
    index 247bf0b1582c..b352e507b17f 100644
    --- a/kernel/watchdog_hld.c
    +++ b/kernel/watchdog_hld.c
    @@ -106,14 +106,8 @@ static struct perf_event_attr wd_hw_attr = {
    .disabled = 1,
    };

    -/* Callback function for perf event subsystem */
    -static void watchdog_overflow_callback(struct perf_event *event,
    - struct perf_sample_data *data,
    - struct pt_regs *regs)
    +void inspect_for_hardlockups(struct pt_regs *regs)
    {
    - /* Ensure the watchdog never gets throttled */
    - event->hw.interrupts = 0;
    -
    if (__this_cpu_read(watchdog_nmi_touch) == true) {
    __this_cpu_write(watchdog_nmi_touch, false);
    return;
    @@ -163,6 +157,16 @@ static void watchdog_overflow_callback(struct perf_event *event,
    return;
    }

    +/* Callback function for perf event subsystem */
    +static void watchdog_overflow_callback(struct perf_event *event,
    + struct perf_sample_data *data,
    + struct pt_regs *regs)
    +{
    + /* Ensure the watchdog never gets throttled */
    + event->hw.interrupts = 0;
    + inspect_for_hardlockups(regs);
    +}
    +
    static int hardlockup_detector_event_create(void)
    {
    unsigned int cpu = smp_processor_id();
    --
    2.17.1
    \
     
     \ /
      Last update: 2022-05-06 02:01    [W:4.217 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site