|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 3/6] xen/softirq: Rework arch_skip_send_event_check() into arch_pend_softirq()
On Wed, Jul 02, 2025 at 03:41:18PM +0100, Andrew Cooper wrote:
> x86 is the only architecture wanting an optimisation here, but the
> test_and_set_bit() is a store into the monitored line and is racy with
> determining whether an IPI can be skipped.
>
> Instead, implement a new arch helper with different semantics; to make the
> softirq pending and decide about IPIs together. For now, implement the
> default helper. It will be overridden by x86 in a subsequent change.
>
> No functional change.
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
With the adjusted commit message you proposed to Jan:
Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
Just one nit below to comment something.
> ---
> CC: Jan Beulich <JBeulich@xxxxxxxx>
> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> CC: Anthony PERARD <anthony.perard@xxxxxxxxxx>
> CC: Michal Orzel <michal.orzel@xxxxxxx>
> CC: Julien Grall <julien@xxxxxxx>
> CC: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> ---
> xen/arch/x86/acpi/cpu_idle.c | 5 -----
> xen/arch/x86/include/asm/softirq.h | 2 --
> xen/common/softirq.c | 8 ++------
> xen/include/xen/softirq.h | 16 ++++++++++++++++
> 4 files changed, 18 insertions(+), 13 deletions(-)
>
> diff --git a/xen/arch/x86/acpi/cpu_idle.c b/xen/arch/x86/acpi/cpu_idle.c
> index dbcb80d81db9..caa0fef0b3b1 100644
> --- a/xen/arch/x86/acpi/cpu_idle.c
> +++ b/xen/arch/x86/acpi/cpu_idle.c
> @@ -436,11 +436,6 @@ static int __init cf_check cpu_idle_key_init(void)
> }
> __initcall(cpu_idle_key_init);
>
> -bool arch_skip_send_event_check(unsigned int cpu)
> -{
> - return false;
> -}
> -
> void mwait_idle_with_hints(unsigned int eax, unsigned int ecx)
> {
> unsigned int cpu = smp_processor_id();
> diff --git a/xen/arch/x86/include/asm/softirq.h
> b/xen/arch/x86/include/asm/softirq.h
> index 415ee866c79d..e4b194f069fb 100644
> --- a/xen/arch/x86/include/asm/softirq.h
> +++ b/xen/arch/x86/include/asm/softirq.h
> @@ -9,6 +9,4 @@
> #define HVM_DPCI_SOFTIRQ (NR_COMMON_SOFTIRQS + 4)
> #define NR_ARCH_SOFTIRQS 5
>
> -bool arch_skip_send_event_check(unsigned int cpu);
> -
> #endif /* __ASM_SOFTIRQ_H__ */
> diff --git a/xen/common/softirq.c b/xen/common/softirq.c
> index 60f344e8425e..0368011f95d1 100644
> --- a/xen/common/softirq.c
> +++ b/xen/common/softirq.c
> @@ -94,9 +94,7 @@ void cpumask_raise_softirq(const cpumask_t *mask, unsigned
> int nr)
> raise_mask = &per_cpu(batch_mask, this_cpu);
>
> for_each_cpu(cpu, mask)
> - if ( !test_and_set_bit(nr, &softirq_pending(cpu)) &&
> - cpu != this_cpu &&
> - !arch_skip_send_event_check(cpu) )
> + if ( !arch_pend_softirq(nr, cpu) && cpu != this_cpu )
> __cpumask_set_cpu(cpu, raise_mask);
>
> if ( raise_mask == &send_mask )
> @@ -107,9 +105,7 @@ void cpu_raise_softirq(unsigned int cpu, unsigned int nr)
> {
> unsigned int this_cpu = smp_processor_id();
>
> - if ( test_and_set_bit(nr, &softirq_pending(cpu))
> - || (cpu == this_cpu)
> - || arch_skip_send_event_check(cpu) )
> + if ( arch_pend_softirq(nr, cpu) || cpu == this_cpu )
> return;
>
> if ( !per_cpu(batching, this_cpu) || in_irq() )
> diff --git a/xen/include/xen/softirq.h b/xen/include/xen/softirq.h
> index e9f79ec0ce3e..0814c8e5cd41 100644
> --- a/xen/include/xen/softirq.h
> +++ b/xen/include/xen/softirq.h
> @@ -23,6 +23,22 @@ enum {
>
> #define NR_SOFTIRQS (NR_COMMON_SOFTIRQS + NR_ARCH_SOFTIRQS)
>
> +/*
> + * Ensure softirq @nr is pending on @cpu. Return true if an IPI can be
> + * skipped, false if the IPI cannot be skipped.
> + */
> +#ifndef arch_pend_softirq
> +static always_inline bool arch_pend_softirq(unsigned int nr, unsigned int
> cpu)
Nit: I would maybe it arch_set_softirq(), I find `pend` not that clear
(I would rather fully spell `pending` instead).
Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |