From da45c8d5f051434a3c68397e66ae2d3b3c97cdec Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Wed, 11 Feb 2026 14:32:21 -0800 Subject: [PATCH] perf/core: Simplify __detach_global_ctx_data() Like in the attach_global_ctx_data() it has a O(N^2) loop to delete task context data for each thread. But perf_free_ctx_data_rcu() can be called under RCU read lock, so just calls it directly rather than iterating the whole thread list again. Signed-off-by: Namhyung Kim Signed-off-by: Peter Zijlstra (Intel) Link: https://patch.msgid.link/20260211223222.3119790-4-namhyung@kernel.org --- kernel/events/core.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/kernel/events/core.c b/kernel/events/core.c index d357714fc02eb..5eeae8636996c 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -5560,22 +5560,15 @@ static void __detach_global_ctx_data(void) struct task_struct *g, *p; struct perf_ctx_data *cd; -again: scoped_guard (rcu) { for_each_process_thread(g, p) { cd = rcu_dereference(p->perf_ctx_data); - if (!cd || !cd->global) - continue; - cd->global = 0; - get_task_struct(p); - goto detach; + if (cd && cd->global) { + cd->global = 0; + detach_task_ctx_data(p); + } } } - return; -detach: - detach_task_ctx_data(p); - put_task_struct(p); - goto again; } static void detach_global_ctx_data(void) -- 2.47.3