watchdog/core, powerpc: Lock cpus across reconfiguration
Instead of dropping the cpu hotplug lock after stopping NMI watchdog and threads and reaquiring for restart, the code and the protection rules become more obvious when holding cpu hotplug lock across the full reconfiguration. Suggested-by: Linus Torvalds <torvalds@linuxfoundation.org> Signed-off-by: Thomas 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.1710022105570.2114@nanos
This commit is contained in:
@@ -535,7 +535,6 @@ static void softlockup_update_smpboot_threads(void)
|
||||
|
||||
smpboot_update_cpumask_percpu_thread(&watchdog_threads,
|
||||
&watchdog_allowed_mask);
|
||||
__lockup_detector_cleanup();
|
||||
}
|
||||
|
||||
/* Temporarily park all watchdog threads */
|
||||
@@ -554,6 +553,7 @@ static void softlockup_unpark_threads(void)
|
||||
|
||||
static void softlockup_reconfigure_threads(void)
|
||||
{
|
||||
cpus_read_lock();
|
||||
watchdog_nmi_stop();
|
||||
softlockup_park_all_threads();
|
||||
set_sample_period();
|
||||
@@ -561,6 +561,12 @@ static void softlockup_reconfigure_threads(void)
|
||||
if (watchdog_enabled && watchdog_thresh)
|
||||
softlockup_unpark_threads();
|
||||
watchdog_nmi_start();
|
||||
cpus_read_unlock();
|
||||
/*
|
||||
* Must be called outside the cpus locked section to prevent
|
||||
* recursive locking in the perf code.
|
||||
*/
|
||||
__lockup_detector_cleanup();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -605,9 +611,11 @@ static inline void watchdog_disable_all_cpus(void) { }
|
||||
static inline void softlockup_init_threads(void) { }
|
||||
static void softlockup_reconfigure_threads(void)
|
||||
{
|
||||
cpus_read_lock();
|
||||
watchdog_nmi_stop();
|
||||
lockup_detector_update_enable();
|
||||
watchdog_nmi_start();
|
||||
cpus_read_unlock();
|
||||
}
|
||||
#endif /* !CONFIG_SOFTLOCKUP_DETECTOR */
|
||||
|
||||
|
Reference in New Issue
Block a user