aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2010-04-08 18:28:14 -0400
committerFrederic Weisbecker <fweisbec@gmail.com>2010-04-14 12:20:33 -0400
commitdf8290bf7ea6b3051e2f315579a6e829309ec1ed (patch)
treee142ed95335a9e1790deabc11448ee6e215bb855
parent76e1d9047e4edefb8ada20aa90d5762306082bd6 (diff)
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 <fweisbec@gmail.com> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Ingo Molnar <mingo@elte.hu>
-rw-r--r--kernel/perf_event.c9
1 files changed, 1 insertions, 8 deletions
diff --git a/kernel/perf_event.c b/kernel/perf_event.c
index 9efdfe5b8d3b..095101d685bc 100644
--- a/kernel/perf_event.c
+++ b/kernel/perf_event.c
@@ -4164,15 +4164,8 @@ static enum hrtimer_restart perf_swevent_hrtimer(struct hrtimer *hrtimer)
4164 perf_sample_data_init(&data, 0); 4164 perf_sample_data_init(&data, 0);
4165 data.period = event->hw.last_period; 4165 data.period = event->hw.last_period;
4166 regs = get_irq_regs(); 4166 regs = get_irq_regs();
4167 /*
4168 * In case we exclude kernel IPs or are somehow not in interrupt
4169 * context, provide the next best thing, the user IP.
4170 */
4171 if ((event->attr.exclude_kernel || !regs) &&
4172 !event->attr.exclude_user)
4173 regs = task_pt_regs(current);
4174 4167
4175 if (regs) { 4168 if (regs && !perf_exclude_event(event, regs)) {
4176 if (!(event->attr.exclude_idle && current->pid == 0)) 4169 if (!(event->attr.exclude_idle && current->pid == 0))
4177 if (perf_event_overflow(event, 0, &data, regs)) 4170 if (perf_event_overflow(event, 0, &data, regs))
4178 ret = HRTIMER_NORESTART; 4171 ret = HRTIMER_NORESTART;