On Fri, Jan 20, 2017 at 1:20 AM, Peter Zijlstra <[email protected]> wrote: > On Wed, Jan 18, 2017 at 11:24:54AM -0800, David Carrillo-Cisneros wrote: >> cpuctx->unique_pmu was originally introduced as a way to identify cpuctxs >> with shared pmus in order to avoid visiting the same cpuctx more than once >> in a for_each_pmu loop. >> >> cpuctx->unique_pmu == cpuctx->pmu in non-software task contexts since they >> have only one pmu per cpuctx. Since perf_pmu_sched_task is only called in >> hw contexts, this patch replaces cpuctx->unique_pmu by cpuctx->pmu in it. >> >> The change above, together with the previous patch in this series, removed >> the remaining uses of cpuctx->unique_pmu, so we remove it altogether. >> >> Signed-off-by: David Carrillo-Cisneros <[email protected]> >> Acked-by: Mark Rutland <[email protected]> > > >> @@ -8572,37 +8572,10 @@ static struct perf_cpu_context __percpu >> *find_pmu_context(int ctxn) >> return NULL; >> } >> >> -static void update_pmu_context(struct pmu *pmu, struct pmu *old_pmu) >> -{ >> - int cpu; >> - >> - for_each_possible_cpu(cpu) { >> - struct perf_cpu_context *cpuctx; >> - >> - cpuctx = per_cpu_ptr(pmu->pmu_cpu_context, cpu); >> - >> - if (cpuctx->unique_pmu == old_pmu) >> - cpuctx->unique_pmu = pmu; >> - } >> -} >> - >> static void free_pmu_context(struct pmu *pmu) >> { >> - struct pmu *i; >> - >> mutex_lock(&pmus_lock); >> - /* >> - * Like a real lame refcount. >> - */ >> - list_for_each_entry(i, &pmus, entry) { >> - if (i->pmu_cpu_context == pmu->pmu_cpu_context) { >> - update_pmu_context(i, pmu); >> - goto out; >> - } >> - } >> - >> free_percpu(pmu->pmu_cpu_context); >> -out: >> mutex_unlock(&pmus_lock); >> } > > This very much relies on us never calling perf_pmu_unregister() on the > software PMUs afaict. A condition not mention in the Changelog. > What's a good way to solve this? Update the Changelog or add code to update ctx->pmu?
This issue would go away cleanly if we were to remove the context sharing across pmu's. Would you support work in that direction? Thanks, David

