]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
perf/core: Speed up kexec shutdown by avoiding unnecessary cross CPU calls
authorJan H. Schönherr <jschoenh@amazon.de>
Tue, 13 Jan 2026 20:34:46 +0000 (21:34 +0100)
committerPeter Zijlstra <peterz@infradead.org>
Tue, 13 Jan 2026 20:39:01 +0000 (21:39 +0100)
There are typically a lot of PMUs registered, but in many cases only few
of them have an event registered (like the "cpu" PMU in the presence of
the watchdog). As the mutex is already held, it's safe to just check for
existing events before doing the cross CPU call.

This change saves tens of milliseconds from kexec time (perceived as
steal time during a hypervisor host update), with <2ms remaining for
this step in the shutdown. There might be additional potential for
parallelization or we could just disable performance monitoring during
the actual shutdown and be less graceful about it.

Signed-off-by: Jan H. Schönherr <jschoenh@amazon.de>
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
kernel/events/core.c

index 376fb07d869b8b50f811325f58c6555bb7dd71c7..101da5c1ab508d34c85cde59cba55effd53f69e3 100644 (file)
@@ -15066,7 +15066,8 @@ static void perf_event_exit_cpu_context(int cpu)
        ctx = &cpuctx->ctx;
 
        mutex_lock(&ctx->mutex);
-       smp_call_function_single(cpu, __perf_event_exit_context, ctx, 1);
+       if (ctx->nr_events)
+               smp_call_function_single(cpu, __perf_event_exit_context, ctx, 1);
        cpuctx->online = 0;
        mutex_unlock(&ctx->mutex);
        mutex_unlock(&pmus_lock);