From 0de7f98bcd3e23d9ad4bd8d8113f7483f6c51f2d Mon Sep 17 00:00:00 2001 From: Stephane Eranian Date: Thu, 26 Aug 2010 16:40:01 +0200 Subject: [PATCH] --- yaml --- r: 210351 b: refs/heads/master c: fa66f07aa1f0950e1dc78b7ab39728b3f8aa77a1 h: refs/heads/master i: 210349: 880646edec0ba83dcf2661db2d7f9ced9c117541 210347: 2c6ec2ea784ba984e1235f9f6e436be71c80402c 210343: 2ad3c800fbefd2abc1e472d15cd6635bc534b3ce 210335: 1a1c134034643367b8f7161d28ceda4afff34072 v: v3 --- [refs] | 2 +- trunk/kernel/perf_event.c | 26 ++++++++++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 696e5c32cc54..939f2f75919d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 5225c45899e872383ca39f5533d28ec63c54b39e +refs/heads/master: fa66f07aa1f0950e1dc78b7ab39728b3f8aa77a1 diff --git a/trunk/kernel/perf_event.c b/trunk/kernel/perf_event.c index 403d1804b198..657555a5f30f 100644 --- a/trunk/kernel/perf_event.c +++ b/trunk/kernel/perf_event.c @@ -402,11 +402,31 @@ static void perf_group_detach(struct perf_event *event) } } +static inline int +event_filter_match(struct perf_event *event) +{ + return event->cpu == -1 || event->cpu == smp_processor_id(); +} + static void event_sched_out(struct perf_event *event, struct perf_cpu_context *cpuctx, struct perf_event_context *ctx) { + u64 delta; + /* + * An event which could not be activated because of + * filter mismatch still needs to have its timings + * maintained, otherwise bogus information is return + * via read() for time_enabled, time_running: + */ + if (event->state == PERF_EVENT_STATE_INACTIVE + && !event_filter_match(event)) { + delta = ctx->time - event->tstamp_stopped; + event->tstamp_running += delta; + event->tstamp_stopped = ctx->time; + } + if (event->state != PERF_EVENT_STATE_ACTIVE) return; @@ -432,9 +452,7 @@ group_sched_out(struct perf_event *group_event, struct perf_event_context *ctx) { struct perf_event *event; - - if (group_event->state != PERF_EVENT_STATE_ACTIVE) - return; + int state = group_event->state; event_sched_out(group_event, cpuctx, ctx); @@ -444,7 +462,7 @@ group_sched_out(struct perf_event *group_event, list_for_each_entry(event, &group_event->sibling_list, group_entry) event_sched_out(event, cpuctx, ctx); - if (group_event->attr.exclusive) + if (state == PERF_EVENT_STATE_ACTIVE && group_event->attr.exclusive) cpuctx->exclusive = 0; }