Use the shorthand broadcast delivery if the static key controlling it is
enabled. If not use the regular one by one IPI mechanism.

Signed-off-by: Thomas Gleixner <[email protected]>
---
 arch/x86/kernel/apic/apic_flat_64.c |   24 +++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)

--- a/arch/x86/kernel/apic/apic_flat_64.c
+++ b/arch/x86/kernel/apic/apic_flat_64.c
@@ -80,7 +80,9 @@ static void flat_send_IPI_allbutself(int
 {
        int cpu = smp_processor_id();
 
-       if (IS_ENABLED(CONFIG_HOTPLUG_CPU) || vector == NMI_VECTOR) {
+       if (static_branch_likely(&apic_use_ipi_shorthand)) {
+               __default_send_IPI_shortcut(APIC_DEST_ALLBUT, vector);
+       } else {
                if (!cpumask_equal(cpu_online_mask, cpumask_of(cpu))) {
                        unsigned long mask = cpumask_bits(cpu_online_mask)[0];
 
@@ -89,18 +91,15 @@ static void flat_send_IPI_allbutself(int
 
                        _flat_send_IPI_mask(mask, vector);
                }
-       } else if (num_online_cpus() > 1) {
-               __default_send_IPI_shortcut(APIC_DEST_ALLBUT, vector);
        }
 }
 
 static void flat_send_IPI_all(int vector)
 {
-       if (vector == NMI_VECTOR) {
-               flat_send_IPI_mask(cpu_online_mask, vector);
-       } else {
+       if (static_branch_likely(&apic_use_ipi_shorthand))
                __default_send_IPI_shortcut(APIC_DEST_ALLINC, vector);
-       }
+       else
+               flat_send_IPI_mask(cpu_online_mask, vector);
 }
 
 static unsigned int flat_get_apic_id(unsigned long x)
@@ -218,12 +217,19 @@ static void physflat_init_apic_ldr(void)
 
 static void physflat_send_IPI_allbutself(int vector)
 {
-       default_send_IPI_mask_allbutself_phys(cpu_online_mask, vector);
+       if (static_branch_likely(&apic_use_ipi_shorthand)) {
+               __default_send_IPI_shortcut(APIC_DEST_ALLBUT, vector);
+       } else {
+               default_send_IPI_mask_allbutself_phys(cpu_online_mask, vector);
+       }
 }
 
 static void physflat_send_IPI_all(int vector)
 {
-       default_send_IPI_mask_sequence_phys(cpu_online_mask, vector);
+       if (static_branch_likely(&apic_use_ipi_shorthand))
+               __default_send_IPI_shortcut(APIC_DEST_ALLBUT, vector);
+       else
+               default_send_IPI_mask_sequence_phys(cpu_online_mask, vector);
 }
 
 static int physflat_probe(void)


Reply via email to