Commit 5490125d authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Ingo Molnar

watchdog/core: Remove broken suspend/resume interfaces

This interface has several issues:

 - It's causing recursive locking of the hotplug lock.

 - It's complete overkill to teardown all threads and then recreate them

The same can be achieved with the simple hardlockup_detector_perf_stop /
restart() interfaces. The abuse from the busy looping poweroff() loop of
PARISC has been solved as well.

Remove the cruft.
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarDon Zickus <dzickus@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Chris Metcalf <cmetcalf@mellanox.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Sebastian Siewior <bigeasy@linutronix.de>
Cc: Ulrich Obergfell <uobergfe@redhat.com>
Link: http://lkml.kernel.org/r/20170912194146.487537732@linutronix.deSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 47bb4baf
...@@ -310,9 +310,6 @@ static int start_wd_on_cpu(unsigned int cpu) ...@@ -310,9 +310,6 @@ static int start_wd_on_cpu(unsigned int cpu)
if (!(watchdog_enabled & NMI_WATCHDOG_ENABLED)) if (!(watchdog_enabled & NMI_WATCHDOG_ENABLED))
return 0; return 0;
if (watchdog_suspended)
return 0;
if (!cpumask_test_cpu(cpu, &watchdog_cpumask)) if (!cpumask_test_cpu(cpu, &watchdog_cpumask))
return 0; return 0;
......
...@@ -164,7 +164,6 @@ extern int watchdog_thresh; ...@@ -164,7 +164,6 @@ extern int watchdog_thresh;
extern unsigned long watchdog_enabled; extern unsigned long watchdog_enabled;
extern struct cpumask watchdog_cpumask; extern struct cpumask watchdog_cpumask;
extern unsigned long *watchdog_cpumask_bits; extern unsigned long *watchdog_cpumask_bits;
extern int __read_mostly watchdog_suspended;
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
extern int sysctl_softlockup_all_cpu_backtrace; extern int sysctl_softlockup_all_cpu_backtrace;
extern int sysctl_hardlockup_all_cpu_backtrace; extern int sysctl_hardlockup_all_cpu_backtrace;
...@@ -192,17 +191,6 @@ extern int proc_watchdog_thresh(struct ctl_table *, int , ...@@ -192,17 +191,6 @@ extern int proc_watchdog_thresh(struct ctl_table *, int ,
void __user *, size_t *, loff_t *); void __user *, size_t *, loff_t *);
extern int proc_watchdog_cpumask(struct ctl_table *, int, extern int proc_watchdog_cpumask(struct ctl_table *, int,
void __user *, size_t *, loff_t *); void __user *, size_t *, loff_t *);
extern int lockup_detector_suspend(void);
extern void lockup_detector_resume(void);
#else
static inline int lockup_detector_suspend(void)
{
return 0;
}
static inline void lockup_detector_resume(void)
{
}
#endif #endif
#ifdef CONFIG_HAVE_ACPI_APEI_NMI #ifdef CONFIG_HAVE_ACPI_APEI_NMI
......
...@@ -97,19 +97,6 @@ unsigned long *watchdog_cpumask_bits = cpumask_bits(&watchdog_cpumask); ...@@ -97,19 +97,6 @@ unsigned long *watchdog_cpumask_bits = cpumask_bits(&watchdog_cpumask);
* unregistered/stopped, so it is an indicator whether the threads exist. * unregistered/stopped, so it is an indicator whether the threads exist.
*/ */
static int __read_mostly watchdog_running; static int __read_mostly watchdog_running;
/*
* If a subsystem has a need to deactivate the watchdog temporarily, it
* can use the suspend/resume interface to achieve this. The content of
* the 'watchdog_suspended' variable reflects this state. Existing threads
* are parked/unparked by the lockup_detector_{suspend|resume} functions
* (see comment blocks pertaining to those functions for further details).
*
* 'watchdog_suspended' also prevents threads from being registered/started
* or unregistered/stopped via parameters in /proc/sys/kernel, so the state
* of 'watchdog_running' cannot change while the watchdog is deactivated
* temporarily (see related code in 'proc' handlers).
*/
int __read_mostly watchdog_suspended;
/* /*
* These functions can be overridden if an architecture implements its * These functions can be overridden if an architecture implements its
...@@ -136,7 +123,6 @@ void __weak watchdog_nmi_disable(unsigned int cpu) ...@@ -136,7 +123,6 @@ void __weak watchdog_nmi_disable(unsigned int cpu)
* - watchdog_cpumask * - watchdog_cpumask
* - sysctl_hardlockup_all_cpu_backtrace * - sysctl_hardlockup_all_cpu_backtrace
* - hardlockup_panic * - hardlockup_panic
* - watchdog_suspended
*/ */
void __weak watchdog_nmi_reconfigure(void) void __weak watchdog_nmi_reconfigure(void)
{ {
...@@ -672,61 +658,6 @@ void lockup_detector_soft_poweroff(void) ...@@ -672,61 +658,6 @@ void lockup_detector_soft_poweroff(void)
watchdog_enabled = 0; watchdog_enabled = 0;
} }
/*
* Suspend the hard and soft lockup detector by parking the watchdog threads.
*/
int lockup_detector_suspend(void)
{
int ret = 0;
get_online_cpus();
mutex_lock(&watchdog_proc_mutex);
/*
* Multiple suspend requests can be active in parallel (counted by
* the 'watchdog_suspended' variable). If the watchdog threads are
* running, the first caller takes care that they will be parked.
* The state of 'watchdog_running' cannot change while a suspend
* request is active (see related code in 'proc' handlers).
*/
if (watchdog_running && !watchdog_suspended)
ret = watchdog_park_threads();
if (ret == 0)
watchdog_suspended++;
else {
watchdog_disable_all_cpus();
pr_err("Failed to suspend lockup detectors, disabled\n");
watchdog_enabled = 0;
}
watchdog_nmi_reconfigure();
mutex_unlock(&watchdog_proc_mutex);
return ret;
}
/*
* Resume the hard and soft lockup detector by unparking the watchdog threads.
*/
void lockup_detector_resume(void)
{
mutex_lock(&watchdog_proc_mutex);
watchdog_suspended--;
/*
* The watchdog threads are unparked if they were previously running
* and if there is no more active suspend request.
*/
if (watchdog_running && !watchdog_suspended)
watchdog_unpark_threads();
watchdog_nmi_reconfigure();
mutex_unlock(&watchdog_proc_mutex);
put_online_cpus();
}
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
/* /*
...@@ -775,12 +706,6 @@ static int proc_watchdog_common(int which, struct ctl_table *table, int write, ...@@ -775,12 +706,6 @@ static int proc_watchdog_common(int which, struct ctl_table *table, int write,
get_online_cpus(); get_online_cpus();
mutex_lock(&watchdog_proc_mutex); mutex_lock(&watchdog_proc_mutex);
if (watchdog_suspended) {
/* no parameter changes allowed while watchdog is suspended */
err = -EAGAIN;
goto out;
}
/* /*
* If the parameter is being read return the state of the corresponding * If the parameter is being read return the state of the corresponding
* bit(s) in 'watchdog_enabled', else update 'watchdog_enabled' and the * bit(s) in 'watchdog_enabled', else update 'watchdog_enabled' and the
...@@ -872,12 +797,6 @@ int proc_watchdog_thresh(struct ctl_table *table, int write, ...@@ -872,12 +797,6 @@ int proc_watchdog_thresh(struct ctl_table *table, int write,
get_online_cpus(); get_online_cpus();
mutex_lock(&watchdog_proc_mutex); mutex_lock(&watchdog_proc_mutex);
if (watchdog_suspended) {
/* no parameter changes allowed while watchdog is suspended */
err = -EAGAIN;
goto out;
}
old = ACCESS_ONCE(watchdog_thresh); old = ACCESS_ONCE(watchdog_thresh);
err = proc_dointvec_minmax(table, write, buffer, lenp, ppos); err = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
...@@ -917,12 +836,6 @@ int proc_watchdog_cpumask(struct ctl_table *table, int write, ...@@ -917,12 +836,6 @@ int proc_watchdog_cpumask(struct ctl_table *table, int write,
get_online_cpus(); get_online_cpus();
mutex_lock(&watchdog_proc_mutex); mutex_lock(&watchdog_proc_mutex);
if (watchdog_suspended) {
/* no parameter changes allowed while watchdog is suspended */
err = -EAGAIN;
goto out;
}
err = proc_do_large_bitmap(table, write, buffer, lenp, ppos); err = proc_do_large_bitmap(table, write, buffer, lenp, ppos);
if (!err && write) { if (!err && write) {
/* Remove impossible cpus to keep sysctl output cleaner. */ /* Remove impossible cpus to keep sysctl output cleaner. */
...@@ -941,7 +854,7 @@ int proc_watchdog_cpumask(struct ctl_table *table, int write, ...@@ -941,7 +854,7 @@ int proc_watchdog_cpumask(struct ctl_table *table, int write,
watchdog_nmi_reconfigure(); watchdog_nmi_reconfigure();
} }
out:
mutex_unlock(&watchdog_proc_mutex); mutex_unlock(&watchdog_proc_mutex);
put_online_cpus(); put_online_cpus();
return err; return err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment