Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ab5fe3ff authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Ingo Molnar
Browse files

watchdog/hardlockup: Clean up hotplug locking mess



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: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarDon 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: default avatarIngo Molnar <mingo@kernel.org>
parent a33d4484
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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();
}

/*
+0 −6
Original line number Diff line number Diff line
@@ -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 */