watchdog/hardlockup/perf: Cure UP damage
for_each_cpu() unintuitively reports CPU0 as set independend of the actual cpumask content on UP kernels. That leads to a NULL pointer dereference when the cleanup function is invoked and there is no event to clean up. Reported-by: Fengguang Wu <fengguang.wu@intel.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
ab5fe3ff38
commit
115ef3b7e6
|
@ -220,8 +220,13 @@ void hardlockup_detector_perf_cleanup(void)
|
||||||
for_each_cpu(cpu, &dead_events_mask) {
|
for_each_cpu(cpu, &dead_events_mask) {
|
||||||
struct perf_event *event = per_cpu(watchdog_ev, cpu);
|
struct perf_event *event = per_cpu(watchdog_ev, cpu);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Required because for_each_cpu() reports unconditionally
|
||||||
|
* CPU0 as set on UP kernels. Sigh.
|
||||||
|
*/
|
||||||
|
if (event)
|
||||||
|
perf_event_release_kernel(event);
|
||||||
per_cpu(watchdog_ev, cpu) = NULL;
|
per_cpu(watchdog_ev, cpu) = NULL;
|
||||||
perf_event_release_kernel(event);
|
|
||||||
}
|
}
|
||||||
cpumask_clear(&dead_events_mask);
|
cpumask_clear(&dead_events_mask);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue