[patch 17/18] x86/apic/flat64: Add conditional IPI shorthands support

From: Thomas Gleixner
Date: Wed Jul 03 2019 - 07:04:25 EST


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 <tglx@xxxxxxxxxxxxx>
---
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)