summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorNamhyung Kim <namhyung@kernel.org>2026-02-11 14:32:21 -0800
committerPeter Zijlstra <peterz@infradead.org>2026-02-27 16:40:22 +0100
commitda45c8d5f051434a3c68397e66ae2d3b3c97cdec (patch)
treeeac0be6ee982477dffeac0dada09d1415c48289d /kernel
parentbec2ee2390c95ed0c44494340464e69e79802e4a (diff)
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 <namhyung@kernel.org> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://patch.msgid.link/20260211223222.3119790-4-namhyung@kernel.org
Diffstat (limited to 'kernel')
-rw-r--r--kernel/events/core.c15
1 files changed, 4 insertions, 11 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c
index d357714fc02e..5eeae8636996 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)