Messages in this thread | | | Subject | Re: [RFC][PATCH 5/9] perf: Simplify and fix __perf_install_in_context | From | Peter Zijlstra <> | Date | Sun, 10 Apr 2011 10:13:05 +0200 |
| |
On Sat, 2011-04-09 at 21:17 +0200, Peter Zijlstra wrote: > + if (task_ctx) { > + task_ctx_sched_out(task_ctx); > + /* > + * If the context we're installing events in is not the > + * active task_ctx, flip them. > + */ > + if (ctx->task && task_ctx != ctx) { > + raw_spin_unlock(&cpuctx->ctx.lock); > + raw_spin_lock(&ctx->lock); > + cpuctx->task_ctx = task_ctx = ctx; > + } > + task = task_ctx->task; > + }
That is actually buggy, it should read something like:
if (task_ctx) task_ctx_sched_out(task_ctx);
if (ctx->task && task_ctx != ctx) { raw_spin_unlock(&task_ctx->lock); raw_spin_lock(&ctx->lock); cpuctx->task_ctx = task_ctx = ctx; }
if (task_ctx) task = task_ctx->task;
Aside from the trivial locking bug fixed, the previous version wouldn't actually deal with installing a task_ctx where there was none before.
| |