[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20190703105917.153388644@linutronix.de>
Date: Wed, 03 Jul 2019 12:54:48 +0200
From: Thomas Gleixner <tglx@...utronix.de>
To: LKML <linux-kernel@...r.kernel.org>
Cc: x86@...nel.org, Nadav Amit <namit@...are.com>,
Ricardo Neri <ricardo.neri-calderon@...ux.intel.com>,
Stephane Eranian <eranian@...gle.com>,
Feng Tang <feng.tang@...el.com>
Subject: [patch 17/18] x86/apic/flat64: Add conditional IPI shorthands support
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@...utronix.de>
---
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)
Powered by blists - more mailing lists