Messages in this thread Patch in this message | | | Date | Mon, 11 Jan 2016 17:25:07 +0100 | From | Peter Zijlstra <> | Subject | [RFC][PATCH 09/12] perf: Make ctx->is_active and cpuctx->task_ctx consistent |
| |
For no apparent reason and to great confusion the rules for ctx->is_active and cpuctx->task_ctx are different. This means that its not always possible to find all active (task) contexts.
Fix this such that if ctx->is_active gets set, we also set (or verify) cpuctx->task_ctx.
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> --- kernel/events/core.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-)
--- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -2330,6 +2330,12 @@ static void ctx_sched_out(struct perf_ev lockdep_assert_held(&ctx->lock); ctx->is_active &= ~event_type; + if (ctx->task) { + WARN_ON_ONCE(cpuctx->task_ctx != ctx); + if (!ctx->is_active) + cpuctx->task_ctx = NULL; + } + if (likely(!ctx->nr_events)) return; @@ -2631,7 +2637,6 @@ static void task_ctx_sched_out(struct pe return; ctx_sched_out(ctx, cpuctx, EVENT_ALL); - cpuctx->task_ctx = NULL; } /* @@ -2714,6 +2719,13 @@ ctx_sched_in(struct perf_event_context * lockdep_assert_held(&ctx->lock); ctx->is_active |= event_type; + if (ctx->task) { + if (!is_active) + cpuctx->task_ctx = ctx; + else + WARN_ON_ONCE(cpuctx->task_ctx != ctx); + } + if (likely(!ctx->nr_events)) return; @@ -2758,12 +2770,7 @@ static void perf_event_context_sched_in( * cpu flexible, task flexible. */ cpu_ctx_sched_out(cpuctx, EVENT_FLEXIBLE); - - if (ctx->nr_events) - cpuctx->task_ctx = ctx; - - perf_event_sched_in(cpuctx, cpuctx->task_ctx, task); - + perf_event_sched_in(cpuctx, ctx, task); perf_pmu_enable(ctx->pmu); perf_ctx_unlock(cpuctx, ctx); }
| |