[PATCH] perf/core: Speed up kexec shutdown by avoiding unnecessary cross CPU calls

David Woodhouse posted 1 patch 1 month ago
There is a newer version of this series
kernel/events/core.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
[PATCH] perf/core: Speed up kexec shutdown by avoiding unnecessary cross CPU calls
Posted by David Woodhouse 1 month ago
From: Jan H. Schönherr <jschoenh@amazon.de>

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>
---
 kernel/events/core.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/kernel/events/core.c b/kernel/events/core.c
index 413b88a4e00f..e36372b3c83f 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -14712,7 +14712,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);
-- 
2.43.0


Re: [PATCH] perf/core: Speed up kexec shutdown by avoiding unnecessary cross CPU calls
Posted by Peter Zijlstra 1 month ago
On Thu, Jan 08, 2026 at 11:14:24AM +0100, David Woodhouse wrote:
> From: Jan H. Schönherr <jschoenh@amazon.de>
> 
> 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>
> ---

Fair enough I suppose. Let me go queue this.

>  kernel/events/core.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/kernel/events/core.c b/kernel/events/core.c
> index 413b88a4e00f..e36372b3c83f 100644
> --- a/kernel/events/core.c
> +++ b/kernel/events/core.c
> @@ -14712,7 +14712,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);
> -- 
> 2.43.0
> 
> 
[tip: perf/core] perf/core: Speed up kexec shutdown by avoiding unnecessary cross CPU calls
Posted by tip-bot2 for Jan H. Sch=C3=B6nherr 3 weeks, 4 days ago
The following commit has been merged into the perf/core branch of tip:

Commit-ID:     f4045e9dbb94825491b6da164f14f22b63de6a4e
Gitweb:        https://git.kernel.org/tip/f4045e9dbb94825491b6da164f14f22b63de6a4e
Author:        Jan H. Sch=C3=B6nherr <jschoenh@amazon.de>
AuthorDate:    Thu, 08 Jan 2026 11:14:24 +01:00
Committer:     Peter Zijlstra <peterz@infradead.org>
CommitterDate: Tue, 13 Jan 2026 11:45:36 +01:00

perf/core: Speed up kexec shutdown by avoiding unnecessary cross CPU calls

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Ã=B6nherr <jschoenh@amazon.de>
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://patch.msgid.link/0d0b7fe70e6dfa7979cb83b05317deb21187f74d.camel@infradead.org
---
 kernel/events/core.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/kernel/events/core.c b/kernel/events/core.c
index 376fb07..101da5c 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -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);