[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20100329224352.GC12254@nowhere>
Date: Tue, 30 Mar 2010 00:43:54 +0200
From: Frederic Weisbecker <fweisbec@...il.com>
To: Peter Zijlstra <peterz@...radead.org>
Cc: Ingo Molnar <mingo@...e.hu>, LKML <linux-kernel@...r.kernel.org>,
Arnaldo Carvalho de Melo <acme@...hat.com>,
Paul Mackerras <paulus@...ba.org>,
David Miller <davem@...emloft.net>
Subject: Re: [PATCH 2/2] perf: Use hot regs with software sched
switch/migrate events
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, ®s))
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, ®s))
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@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists