perf: Optimize perf_pmu_migrate_context()

Thomas reported that offlining CPUs spends a lot of time in
synchronize_rcu() as called from perf_pmu_migrate_context() even though
he's not actually using uncore events.

Turns out, the thing is unconditionally waiting for RCU, even if there's
no actual events to migrate.

Fixes: 0cda4c0231 ("perf: Introduce perf_pmu_migrate_context()")
Reported-by: Thomas Gleixner <[email protected]>
Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
Tested-by: Thomas Gleixner <[email protected]>
Reviewed-by: Thomas Gleixner <[email protected]>
Reviewed-by: Paul E. McKenney <[email protected]>
Link: https://lkml.kernel.org/r/[email protected]
This commit is contained in:
Peter Zijlstra committed 2023-04-05 09:58:46 +02:00
1 parent 197b6b60ae
commit b168098912
1 file changed
+7 -5
+7 -5
View File
@@ -12893,12 +12893,14 @@ void perf_pmu_migrate_context(struct pmu *pmu, int src_cpu, int dst_cpu)
__perf_pmu_remove(src_ctx, src_cpu, pmu, &src_ctx->pinned_groups, &events);
__perf_pmu_remove(src_ctx, src_cpu, pmu, &src_ctx->flexible_groups, &events);
/*
* Wait for the events to quiesce before re-instating them.
*/
synchronize_rcu();
if (!list_empty(&events)) {
/*
* Wait for the events to quiesce before re-instating them.
*/
synchronize_rcu();
__perf_pmu_install(dst_ctx, dst_cpu, pmu, &events);
__perf_pmu_install(dst_ctx, dst_cpu, pmu, &events);
}
mutex_unlock(&dst_ctx->mutex);
mutex_unlock(&src_ctx->mutex);