lkml.org 
[lkml]   [2022]   [Aug]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.19 28/48] watchdog: export lockup_detector_reconfigure
    Date
    From: Laurent Dufour <ldufour@linux.ibm.com>

    [ Upstream commit 7c56a8733d0a2a4be2438a7512566e5ce552fccf ]

    In some circumstances it may be interesting to reconfigure the watchdog
    from inside the kernel.

    On PowerPC, this may helpful before and after a LPAR migration (LPM) is
    initiated, because it implies some latencies, watchdog, and especially NMI
    watchdog is expected to be triggered during this operation. Reconfiguring
    the watchdog with a factor, would prevent it to happen too frequently
    during LPM.

    Rename lockup_detector_reconfigure() as __lockup_detector_reconfigure() and
    create a new function lockup_detector_reconfigure() calling
    __lockup_detector_reconfigure() under the protection of watchdog_mutex.

    Signed-off-by: Laurent Dufour <ldufour@linux.ibm.com>
    [mpe: Squash in build fix from Laurent, reported by Sachin]
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20220713154729.80789-3-ldufour@linux.ibm.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    include/linux/nmi.h | 2 ++
    kernel/watchdog.c | 21 ++++++++++++++++-----
    2 files changed, 18 insertions(+), 5 deletions(-)

    diff --git a/include/linux/nmi.h b/include/linux/nmi.h
    index 750c7f395ca9..f700ff2df074 100644
    --- a/include/linux/nmi.h
    +++ b/include/linux/nmi.h
    @@ -122,6 +122,8 @@ int watchdog_nmi_probe(void);
    int watchdog_nmi_enable(unsigned int cpu);
    void watchdog_nmi_disable(unsigned int cpu);

    +void lockup_detector_reconfigure(void);
    +
    /**
    * touch_nmi_watchdog - restart NMI watchdog timeout.
    *
    diff --git a/kernel/watchdog.c b/kernel/watchdog.c
    index ecb0e8346e65..8e61f21e7e33 100644
    --- a/kernel/watchdog.c
    +++ b/kernel/watchdog.c
    @@ -537,7 +537,7 @@ int lockup_detector_offline_cpu(unsigned int cpu)
    return 0;
    }

    -static void lockup_detector_reconfigure(void)
    +static void __lockup_detector_reconfigure(void)
    {
    cpus_read_lock();
    watchdog_nmi_stop();
    @@ -557,6 +557,13 @@ static void lockup_detector_reconfigure(void)
    __lockup_detector_cleanup();
    }

    +void lockup_detector_reconfigure(void)
    +{
    + mutex_lock(&watchdog_mutex);
    + __lockup_detector_reconfigure();
    + mutex_unlock(&watchdog_mutex);
    +}
    +
    /*
    * Create the watchdog infrastructure and configure the detector(s).
    */
    @@ -573,13 +580,13 @@ static __init void lockup_detector_setup(void)
    return;

    mutex_lock(&watchdog_mutex);
    - lockup_detector_reconfigure();
    + __lockup_detector_reconfigure();
    softlockup_initialized = true;
    mutex_unlock(&watchdog_mutex);
    }

    #else /* CONFIG_SOFTLOCKUP_DETECTOR */
    -static void lockup_detector_reconfigure(void)
    +static void __lockup_detector_reconfigure(void)
    {
    cpus_read_lock();
    watchdog_nmi_stop();
    @@ -587,9 +594,13 @@ static void lockup_detector_reconfigure(void)
    watchdog_nmi_start();
    cpus_read_unlock();
    }
    +void lockup_detector_reconfigure(void)
    +{
    + __lockup_detector_reconfigure();
    +}
    static inline void lockup_detector_setup(void)
    {
    - lockup_detector_reconfigure();
    + __lockup_detector_reconfigure();
    }
    #endif /* !CONFIG_SOFTLOCKUP_DETECTOR */

    @@ -629,7 +640,7 @@ static void proc_watchdog_update(void)
    {
    /* Remove impossible cpus to keep sysctl output clean. */
    cpumask_and(&watchdog_cpumask, &watchdog_cpumask, cpu_possible_mask);
    - lockup_detector_reconfigure();
    + __lockup_detector_reconfigure();
    }

    /*
    --
    2.35.1
    \
     
     \ /
      Last update: 2022-08-14 18:27    [W:4.164 / U:0.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site