Commit 7a26d944 authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Liu Chuang
Browse files

perf: Optimize perf_pmu_migrate_context()

mainline inclusion
from mainline-v6.3-rc6
commit b1680989
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IAL27E

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=b168098912926236bbeebaf7795eb7aab76d2b45



---------------------------

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: 0cda4c02 ("perf: Introduce perf_pmu_migrate_context()")
Reported-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Tested-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarPaul E. McKenney <paulmck@kernel.org>
Link: https://lkml.kernel.org/r/20230403090858.GT4253@hirez.programming.kicks-ass.net


Conflicts:
	kernel/events/core.c
[Due to not merge previous commit
bd275681]
Signed-off-by: default avatarLiu Chuang <liuchuang40@huawei.com>
parent feb0fe58
Loading
Loading
Loading
Loading
+35 −33
Original line number Diff line number Diff line
@@ -12371,6 +12371,7 @@ void perf_pmu_migrate_context(struct pmu *pmu, int src_cpu, int dst_cpu)
		list_add(&event->migrate_entry, &events);
	}

	if (!list_empty(&events)) {
		/*
		 * Wait for the events to quiesce before re-instating them.
		 */
@@ -12408,6 +12409,7 @@ void perf_pmu_migrate_context(struct pmu *pmu, int src_cpu, int dst_cpu)
			perf_install_in_context(dst_ctx, event, dst_cpu);
			get_ctx(dst_ctx);
		}
	}
	mutex_unlock(&dst_ctx->mutex);
	mutex_unlock(&src_ctx->mutex);
}