forked from Minki/linux
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: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Don 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.de Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
47bb4baf7d
commit
5490125d77
@ -310,9 +310,6 @@ static int start_wd_on_cpu(unsigned int cpu)
|
||||
if (!(watchdog_enabled & NMI_WATCHDOG_ENABLED))
|
||||
return 0;
|
||||
|
||||
if (watchdog_suspended)
|
||||
return 0;
|
||||
|
||||
if (!cpumask_test_cpu(cpu, &watchdog_cpumask))
|
||||
return 0;
|
||||
|
||||
|
@ -164,7 +164,6 @@ extern int watchdog_thresh;
|
||||
extern unsigned long watchdog_enabled;
|
||||
extern struct cpumask watchdog_cpumask;
|
||||
extern unsigned long *watchdog_cpumask_bits;
|
||||
extern int __read_mostly watchdog_suspended;
|
||||
#ifdef CONFIG_SMP
|
||||
extern int sysctl_softlockup_all_cpu_backtrace;
|
||||
extern int sysctl_hardlockup_all_cpu_backtrace;
|
||||
@ -192,17 +191,6 @@ extern int proc_watchdog_thresh(struct ctl_table *, int ,
|
||||
void __user *, size_t *, loff_t *);
|
||||
extern int proc_watchdog_cpumask(struct ctl_table *, int,
|
||||
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
|
||||
|
||||
#ifdef CONFIG_HAVE_ACPI_APEI_NMI
|
||||
|
@ -97,19 +97,6 @@ unsigned long *watchdog_cpumask_bits = cpumask_bits(&watchdog_cpumask);
|
||||
* unregistered/stopped, so it is an indicator whether the threads exist.
|
||||
*/
|
||||
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
|
||||
@ -136,7 +123,6 @@ void __weak watchdog_nmi_disable(unsigned int cpu)
|
||||
* - watchdog_cpumask
|
||||
* - sysctl_hardlockup_all_cpu_backtrace
|
||||
* - hardlockup_panic
|
||||
* - watchdog_suspended
|
||||
*/
|
||||
void __weak watchdog_nmi_reconfigure(void)
|
||||
{
|
||||
@ -672,61 +658,6 @@ void lockup_detector_soft_poweroff(void)
|
||||
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
|
||||
|
||||
/*
|
||||
@ -775,12 +706,6 @@ static int proc_watchdog_common(int which, struct ctl_table *table, int write,
|
||||
get_online_cpus();
|
||||
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
|
||||
* 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,
|
||||
get_online_cpus();
|
||||
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);
|
||||
err = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
|
||||
|
||||
@ -917,12 +836,6 @@ int proc_watchdog_cpumask(struct ctl_table *table, int write,
|
||||
get_online_cpus();
|
||||
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);
|
||||
if (!err && write) {
|
||||
/* Remove impossible cpus to keep sysctl output cleaner. */
|
||||
@ -941,7 +854,7 @@ int proc_watchdog_cpumask(struct ctl_table *table, int write,
|
||||
|
||||
watchdog_nmi_reconfigure();
|
||||
}
|
||||
out:
|
||||
|
||||
mutex_unlock(&watchdog_proc_mutex);
|
||||
put_online_cpus();
|
||||
return err;
|
||||
|
Loading…
Reference in New Issue
Block a user