1
0
Fork 0

watchdog/core, powerpc: Replace watchdog_nmi_reconfigure()

The recent cleanup of the watchdog code split watchdog_nmi_reconfigure()
into two stages. One to stop the NMI and one to restart it after
reconfiguration. That was done by adding a boolean 'run' argument to the
code, which is functionally correct but not necessarily a piece of art.

Replace it by two explicit functions: watchdog_nmi_stop() and
watchdog_nmi_start().

Fixes: 6592ad2fcc ("watchdog/core, powerpc: Make watchdog_nmi_reconfigure() two stage")
Requested-by: Linus 'Nursing his pet-peeve' Torvalds <torvalds@linuxfoundation.org>
Signed-off-by: Thomas 'Mopping up garbage' Gleixner <tglx@linutronix.de>
Acked-by: Michael Ellerman <mpe@ellerman.id.au>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: linuxppc-dev@lists.ozlabs.org
Link: http://lkml.kernel.org/r/alpine.DEB.2.20.1710021957480.2114@nanos
zero-colors
Thomas Gleixner 2017-10-02 12:34:50 +02:00
parent 77c01d11bb
commit 6b9dc4806b
3 changed files with 34 additions and 25 deletions

View File

@ -355,19 +355,24 @@ static void watchdog_calc_timeouts(void)
wd_timer_period_ms = watchdog_thresh * 1000 * 2 / 5;
}
void watchdog_nmi_reconfigure(bool run)
void watchdog_nmi_stop(void)
{
int cpu;
cpus_read_lock();
if (!run) {
for_each_cpu(cpu, &wd_cpus_enabled)
stop_wd_on_cpu(cpu);
} else {
watchdog_calc_timeouts();
for_each_cpu_and(cpu, cpu_online_mask, &watchdog_cpumask)
start_wd_on_cpu(cpu);
}
for_each_cpu(cpu, &wd_cpus_enabled)
stop_wd_on_cpu(cpu);
cpus_read_unlock();
}
void watchdog_nmi_start(void)
{
int cpu;
cpus_read_lock();
watchdog_calc_timeouts();
for_each_cpu_and(cpu, cpu_online_mask, &watchdog_cpumask)
start_wd_on_cpu(cpu);
cpus_read_unlock();
}

View File

@ -109,7 +109,8 @@ static inline int hardlockup_detector_perf_init(void) { return 0; }
# endif
#endif
void watchdog_nmi_reconfigure(bool run);
void watchdog_nmi_stop(void);
void watchdog_nmi_start(void);
/**
* touch_nmi_watchdog - restart NMI watchdog timeout.

View File

@ -123,24 +123,27 @@ int __weak __init watchdog_nmi_probe(void)
}
/**
* watchdog_nmi_reconfigure - Optional function to reconfigure NMI watchdogs
* @run: If false stop the watchdogs on all enabled CPUs
* If true start the watchdogs on all enabled CPUs
* watchdog_nmi_stop - Stop the watchdog for reconfiguration
*
* The core call order is:
* watchdog_nmi_reconfigure(false);
* The reconfiguration steps are:
* watchdog_nmi_stop();
* update_variables();
* watchdog_nmi_reconfigure(true);
* watchdog_nmi_start();
*/
void __weak watchdog_nmi_stop(void) { }
/**
* watchdog_nmi_start - Start the watchdog after reconfiguration
*
* The second call which starts the watchdogs again guarantees that the
* following variables are stable across the call.
* Counterpart to watchdog_nmi_stop().
*
* The following variables have been updated in update_variables() and
* contain the currently valid configuration:
* - watchdog_enabled
* - watchdog_thresh
* - watchdog_cpumask
*
* After the call the variables can be changed again.
*/
void __weak watchdog_nmi_reconfigure(bool run) { }
void __weak watchdog_nmi_start(void) { }
/**
* lockup_detector_update_enable - Update the sysctl enable bit
@ -551,13 +554,13 @@ static void softlockup_unpark_threads(void)
static void softlockup_reconfigure_threads(void)
{
watchdog_nmi_reconfigure(false);
watchdog_nmi_stop();
softlockup_park_all_threads();
set_sample_period();
lockup_detector_update_enable();
if (watchdog_enabled && watchdog_thresh)
softlockup_unpark_threads();
watchdog_nmi_reconfigure(true);
watchdog_nmi_start();
}
/*
@ -602,9 +605,9 @@ static inline void watchdog_disable_all_cpus(void) { }
static inline void softlockup_init_threads(void) { }
static void softlockup_reconfigure_threads(void)
{
watchdog_nmi_reconfigure(false);
watchdog_nmi_stop();
lockup_detector_update_enable();
watchdog_nmi_reconfigure(true);
watchdog_nmi_start();
}
#endif /* !CONFIG_SOFTLOCKUP_DETECTOR */