Re: [PATCH 2/2] perf: Use hot regs with software schedswitch/migrate events

From: Frederic Weisbecker
Date: Mon Mar 29 2010 - 18:43:58 EST


On Mon, Mar 29, 2010 at 08:05:38PM +0200, Peter Zijlstra wrote:
> On Mon, 2010-03-29 at 19:47 +0200, Frederic Weisbecker wrote:
> >
> >
> > I'm going to make a quick fix for perf_fetch_caller_regs() that
> > passes task_pt_regs if exclude_kernel for perf/urgent,
> > and I'll do the above cleanups/invasive fixes on perf/core.
> >
> >
> ok, sounds sensible, thanks!


Actually I have doubts about what should be the strict sense
of exclude_kernel.

Does that mean we exclude any event that happened in the kernel?
Or does that mean we exclude the part that happened in the kernel?

Depending on the case, we do either.

In perf_swevent_hrtimer(), we simply go back to task_pt_regs()
if exclude_kernel.

But in other software events, we don't such fix, we actually
filter out the event if it is not user_mode().

So, I'm a bit confused on what to do.
I'm tempted to adopt the meaning from perf_swevent_hrtimer()
for software events too, I'm not sure...

diff --git a/kernel/perf_event.c b/kernel/perf_event.c
index b0feb47..3cb5de8 100644
--- a/kernel/perf_event.c
+++ b/kernel/perf_event.c
@@ -3986,14 +3986,17 @@ static int perf_tp_event_match(struct perf_event *event,
struct perf_sample_data *data);

static int perf_exclude_event(struct perf_event *event,
- struct pt_regs *regs)
+ struct pt_regs **regs)
{
- if (regs) {
- if (event->attr.exclude_user && user_mode(regs))
+ if (*regs) {
+ if (event->attr.exclude_user && user_mode(*regs))
return 1;

- if (event->attr.exclude_kernel && !user_mode(regs))
- return 1;
+ if (event->attr.exclude_kernel && !user_mode(*regs))
+ if (current->mm)
+ *regs = task_pt_regs();
+ else
+ return 1;
}

return 0;
@@ -4017,7 +4020,7 @@ static int perf_swevent_match(struct perf_event *event,
if (event->attr.config != event_id)
return 0;

- if (perf_exclude_event(event, regs))
+ if (perf_exclude_event(event, &regs))
return 0;

if (event->attr.type == PERF_TYPE_TRACEPOINT &&
@@ -4442,7 +4445,7 @@ void perf_bp_event(struct perf_event *bp, void *data)

perf_sample_data_init(&sample, bp->attr.bp_addr);

- if (!perf_exclude_event(bp, regs))
+ if (!perf_exclude_event(bp, &regs))
perf_swevent_add(bp, 1, 1, &sample, regs);
}
#else


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/