kernel_optimize_test/kernel
Thomas Gleixner 9c388a5ed1 watchdog/harclockup/perf: Revert a33d44843d ("watchdog/hardlockup/perf: Simplify deferred event destroy")
Guenter reported a crash in the watchdog/perf code, which is caused by
cleanup() and enable() running concurrently. The reason for this is:

The watchdog functions are serialized via the watchdog_mutex and cpu
hotplug locking, but the enable of the perf based watchdog happens in
context of the unpark callback of the smpboot thread. But that unpark
function is not synchronous inside the locking. The unparking of the thread
just wakes it up and leaves so there is no guarantee when the thread is
executing.

If it starts running _before_ the cleanup happened then it will create a
event and overwrite the dead event pointer. The new event is then cleaned
up because the event is marked dead.

    lock(watchdog_mutex);
    lockup_detector_reconfigure();
        cpus_read_lock();
	stop();
	   park()
	update();
	start();
	   unpark()
	cpus_read_unlock();		thread runs()
					  overwrite dead event ptr
	cleanup();
	  free new event, which is active inside perf....
    unlock(watchdog_mutex);

The park side is safe as that actually waits for the thread to reach
parked state.

Commit a33d44843d removed the protection against this kind of scenario
under the stupid assumption that the hotplug serialization and the
watchdog_mutex cover everything. 

Bring it back.

Reverts: a33d44843d ("watchdog/hardlockup/perf: Simplify deferred event destroy")
Reported-and-tested-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Thomas Feels-stupid Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Don Zickus <dzickus@redhat.com>
Link: https://lkml.kernel.org/r/alpine.DEB.2.20.1710312145190.1942@nanos
2017-11-01 21:18:39 +01:00
..
bpf bpf: rename sk_actions to align with bpf infrastructure 2017-10-29 11:18:48 +09:00
cgroup Revert "net: defer call to cgroup_sk_alloc()" 2017-10-10 20:24:29 -07:00
configs
debug
events perf/core: Fix cgroup time when scheduling descendants 2017-10-10 10:06:55 +02:00
gcov
irq irqchip updates for 4.14-rc5 2017-10-16 10:26:46 +02:00
livepatch livepatch: unpatch all klp_objects if klp_module_coming fails 2017-10-11 15:38:46 +02:00
locking locking/lockdep: Fix stacktrace mess 2017-10-10 10:04:28 +02:00
power PM / s2idle: Invoke the ->wake() platform callback earlier 2017-09-29 01:26:13 +02:00
printk
rcu doc: Fix various RCU docbook comment-header problems 2017-10-19 22:26:11 -04:00
sched membarrier: Provide register expedited private command 2017-10-19 22:13:40 -04:00
time
trace Two updates. 2017-10-04 08:34:01 -07:00
.gitignore
acct.c
async.c
audit_fsnotify.c
audit_tree.c
audit_watch.c
audit.c
audit.h
auditfilter.c
auditsc.c
backtracetest.c
bounds.c
capability.c
compat.c
configs.c
context_tracking.c
cpu_pm.c
cpu.c cpu/hotplug: Reset node state after operation 2017-10-21 16:11:30 +02:00
crash_core.c
crash_dump.c
cred.c
delayacct.c
dma.c
elfcore.c
exec_domain.c
exit.c waitid(): Avoid unbalanced user_access_end() on access_ok() error 2017-10-20 15:32:54 -04:00
extable.c extable: Enable RCU if it is not watching in kernel_text_address() 2017-09-23 16:50:20 -04:00
fork.c kmemleak: clear stale pointers from task stacks 2017-10-13 16:18:33 -07:00
freezer.c
futex_compat.c
futex.c futex: Fix more put_pi_state() vs. exit_pi_state_list() races 2017-11-01 09:05:00 +01:00
groups.c
hung_task.c
irq_work.c
jump_label.c
kallsyms.c
kcmp.c kernel/kcmp.c: drop branch leftover typo 2017-10-03 17:54:25 -07:00
Kconfig.freezer
Kconfig.hz
Kconfig.locks
Kconfig.preempt
kcov.c
kexec_core.c
kexec_file.c
kexec_internal.h
kexec.c
kmod.c
kprobes.c
ksysfs.c
kthread.c
latencytop.c
Makefile
memremap.c memremap: add scheduling point to devm_memremap_pages 2017-10-03 17:54:25 -07:00
module_signing.c
module-internal.h
module.c
notifier.c
nsproxy.c
padata.c
panic.c
params.c kernel/params.c: improve STANDARD_PARAM_DEF readability 2017-10-03 17:54:26 -07:00
pid_namespace.c
pid.c
profile.c
ptrace.c
range.c
reboot.c
relay.c
resource.c
seccomp.c seccomp: make function __get_seccomp_filter static 2017-10-10 11:45:29 -07:00
signal.c
smp.c
smpboot.c watchdog/core, powerpc: Lock cpus across reconfiguration 2017-10-04 10:53:54 +02:00
smpboot.h
softirq.c
stacktrace.c
stop_machine.c
sys_ni.c
sys.c
sysctl_binary.c
sysctl.c Merge branch 'core-watchdog-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2017-10-06 08:36:41 -07:00
task_work.c
taskstats.c
test_kprobes.c
torture.c
tracepoint.c
tsacct.c
ucount.c
uid16.c
umh.c
up.c
user_namespace.c
user-return-notifier.c
user.c
utsname_sysctl.c
utsname.c
watchdog_hld.c watchdog/harclockup/perf: Revert a33d44843d ("watchdog/hardlockup/perf: Simplify deferred event destroy") 2017-11-01 21:18:39 +01:00
watchdog.c watchdog/core: Put softlockup_threads_initialized under ifdef guard 2017-10-04 11:30:50 +02:00
workqueue_internal.h
workqueue.c workqueue: replace pool->manager_arb mutex with a flag 2017-10-10 07:13:57 -07:00