From ff1b2afe56e8bd313e639ff2bd78928f3501c649 Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Fri, 14 Aug 2009 15:39:10 +1000 Subject: [PATCH] --- yaml --- r: 156948 b: refs/heads/master c: e1ac3614ff606ae03677f47459113f98a19af63c h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/kernel/perf_counter.c | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index ec8fc0f4b207..f1cb3f0875d6 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 2932cffc89e9a1476b28a59896fa4f81e0d4f131 +refs/heads/master: e1ac3614ff606ae03677f47459113f98a19af63c diff --git a/trunk/kernel/perf_counter.c b/trunk/kernel/perf_counter.c index 534e20d14d63..b8fe7397b902 100644 --- a/trunk/kernel/perf_counter.c +++ b/trunk/kernel/perf_counter.c @@ -1503,10 +1503,21 @@ static void perf_counter_enable_on_exec(struct task_struct *task) */ static void __perf_counter_read(void *info) { + struct perf_cpu_context *cpuctx = &__get_cpu_var(perf_cpu_context); struct perf_counter *counter = info; struct perf_counter_context *ctx = counter->ctx; unsigned long flags; + /* + * If this is a task context, we need to check whether it is + * the current task context of this cpu. If not it has been + * scheduled out before the smp call arrived. In that case + * counter->count would have been updated to a recent sample + * when the counter was scheduled out. + */ + if (ctx->task && cpuctx->task_ctx != ctx) + return; + local_irq_save(flags); if (ctx->is_active) update_context_time(ctx);