perf: Make clock software events consistent with general exclusion rules
PATCH 1/1 perf: Make clock software events consistent with general exclusion rules
The cpu/task clock events implement their own version of exclusion on top of exclude_user and exclude_kernel.
The result is that when the event triggered in the kernel but we have exclude_kernel set, we try to rewind using task_pt_regs. There are two side effects of this:
- we call task_pt_regs even on kernel threads, which doesn't give us the desired result.
- if the event occured in the kernel, we shouldn't rewind to the user context. We want to actually ignore the event.
get_irq_regs() will always give us the right interrupted context, so use its result and submit it to perf_exclude_context() that knows when an event must be ignored.
Signed-off-by Frederic Weisbecker <[email protected]>
Cc Peter Zijlstra <[email protected]>
Cc Arnaldo Carvalho de Melo <[email protected]>
Cc Paul Mackerras <[email protected]>
Cc Ingo Molnar <[email protected]>
--- kernel/perf_event.c | 9 +-------- 1 files changed, 1 insertions(+), 8 deletions(-)
kernel/perf_event.c +1 -8
@@ -4163,15 +4163,8 @@ static enum hrtimer_restart perf_swevent_hrtimer(struct hrtimer *hrtimer)perf_sample_data_init (&data,0 ); data.period = event->hw.last_period; regs =get_irq_regs (); -/* -* In case we exclude kernel IPs or are somehow not in interrupt -* context, provide the next best thing, the user IP. -*/ -if ((event->attr.exclude_kernel || !regs) && - !event->attr.exclude_user) - regs =task_pt_regs (current); -if (regs) { +if (regs && !perf_exclude_event (event, regs)) {if (!(event->attr.exclude_idle && current->pid ==0 ))if (perf_event_overflow (event,0 , &data, regs)) ret =HRTIMER_NORESTART ;
Signature · 1 line
1.6.2.3