watchdog/hardlockup: Clean up hotplug locking mess
authorThomas Gleixner <tglx@linutronix.de>
Tue, 12 Sep 2017 19:37:23 +0000 (21:37 +0200)
committerIngo Molnar <mingo@kernel.org>
Thu, 14 Sep 2017 09:41:09 +0000 (11:41 +0200)
All watchdog thread related functions are delegated to the smpboot thread
infrastructure, which handles serialization against CPU hotplug correctly.

The sysctl interface is completely decoupled from anything which requires
CPU hotplug protection.

No need to protect the sysctl writes against cpu hotplug anymore. Remove it
and add the now required protection to the powerpc arch_nmi_watchdog
implementation.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Don Zickus <dzickus@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Chris Metcalf <cmetcalf@mellanox.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Sebastian Siewior <bigeasy@linutronix.de>
Cc: Ulrich Obergfell <uobergfe@redhat.com>
Cc: linuxppc-dev@lists.ozlabs.org
Link: http://lkml.kernel.org/r/20170912194148.418497420@linutronix.de
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/powerpc/kernel/watchdog.c
kernel/watchdog.c

index 291af79a98263e023ef4e2dd0642a04e027b4333..dfb0677644801da9c7d2b417142fed7ba4440220 100644 (file)
@@ -359,6 +359,7 @@ void watchdog_nmi_reconfigure(bool run)
 {
        int cpu;
 
+       cpus_read_lock();
        if (!run) {
                for_each_cpu(cpu, &wd_cpus_enabled)
                        stop_wd_on_cpu(cpu);
@@ -367,6 +368,7 @@ void watchdog_nmi_reconfigure(bool run)
                for_each_cpu_and(cpu, cpu_online_mask, &watchdog_cpumask)
                        start_wd_on_cpu(cpu);
        }
+       cpus_read_unlock();
 }
 
 /*
index 5eb11960e4a26a4bdd371e289b5f87cc1d10c1ae..f6ef163b72cdb96dc9adab089d291774c23d9bda 100644 (file)
@@ -664,7 +664,6 @@ static int proc_watchdog_common(int which, struct ctl_table *table, int write,
 {
        int err, old, *param = table->data;
 
-       cpu_hotplug_disable();
        mutex_lock(&watchdog_mutex);
 
        if (!write) {
@@ -681,7 +680,6 @@ static int proc_watchdog_common(int which, struct ctl_table *table, int write,
                        proc_watchdog_update();
        }
        mutex_unlock(&watchdog_mutex);
-       cpu_hotplug_enable();
        return err;
 }
 
@@ -725,7 +723,6 @@ int proc_watchdog_thresh(struct ctl_table *table, int write,
 {
        int err, old;
 
-       cpu_hotplug_disable();
        mutex_lock(&watchdog_mutex);
 
        old = READ_ONCE(watchdog_thresh);
@@ -735,7 +732,6 @@ int proc_watchdog_thresh(struct ctl_table *table, int write,
                proc_watchdog_update();
 
        mutex_unlock(&watchdog_mutex);
-       cpu_hotplug_enable();
        return err;
 }
 
@@ -750,7 +746,6 @@ int proc_watchdog_cpumask(struct ctl_table *table, int write,
 {
        int err;
 
-       cpu_hotplug_disable();
        mutex_lock(&watchdog_mutex);
 
        err = proc_do_large_bitmap(table, write, buffer, lenp, ppos);
@@ -758,7 +753,6 @@ int proc_watchdog_cpumask(struct ctl_table *table, int write,
                proc_watchdog_update();
 
        mutex_unlock(&watchdog_mutex);
-       cpu_hotplug_enable();
        return err;
 }
 #endif /* CONFIG_SYSCTL */