mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 04:24:31 +01:00
perf: Ensure swevent hrtimer is properly destroyed
With the change to hrtimer_try_to_cancel() in
perf_swevent_cancel_hrtimer() it appears possible for the hrtimer to
still be active by the time the event gets freed.
Make sure the event does a full hrtimer_cancel() on the free path by
installing a perf_event::destroy handler.
Fixes: eb3182ef04 ("perf/core: Fix system hang caused by cpu-clock usage")
Reported-by: CyberUnicorns <a101e_iotvul@163.com>
Tested-by: CyberUnicorns <a101e_iotvul@163.com>
Debugged-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
This commit is contained in:
parent
9ace4753a5
commit
ff5860f508
1 changed files with 6 additions and 0 deletions
|
|
@ -11906,6 +11906,11 @@ static void perf_swevent_cancel_hrtimer(struct perf_event *event)
|
|||
}
|
||||
}
|
||||
|
||||
static void perf_swevent_destroy_hrtimer(struct perf_event *event)
|
||||
{
|
||||
hrtimer_cancel(&event->hw.hrtimer);
|
||||
}
|
||||
|
||||
static void perf_swevent_init_hrtimer(struct perf_event *event)
|
||||
{
|
||||
struct hw_perf_event *hwc = &event->hw;
|
||||
|
|
@ -11914,6 +11919,7 @@ static void perf_swevent_init_hrtimer(struct perf_event *event)
|
|||
return;
|
||||
|
||||
hrtimer_setup(&hwc->hrtimer, perf_swevent_hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD);
|
||||
event->destroy = perf_swevent_destroy_hrtimer;
|
||||
|
||||
/*
|
||||
* Since hrtimers have a fixed rate, we can do a static freq->period
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue