[PATCH 1/2] x86/apic/flat: Add specific send IPI logic

From: Jiaqing Zhao
Date: Fri Apr 09 2021 - 01:53:39 EST


Currently, apic_flat.send_IPI() uses default_send_IPI_single(), which
is a wrapper of apic->send_IPI_mask(). Since commit aaffcfd1e82d
("KVM: X86: Implement PV IPIs in linux guest"), KVM PV IPI driver will
override apic->send_IPI_mask(), and may cause unwated side effects.

This patch removes such side effects by creating a specific send_IPI
method.

Signed-off-by: Jiaqing Zhao <jiaqing.zhao@xxxxxxxxx>
---
arch/x86/kernel/apic/apic_flat_64.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kernel/apic/apic_flat_64.c b/arch/x86/kernel/apic/apic_flat_64.c
index 8f72b4351c9f..3196bf220230 100644
--- a/arch/x86/kernel/apic/apic_flat_64.c
+++ b/arch/x86/kernel/apic/apic_flat_64.c
@@ -64,6 +64,13 @@ static void flat_send_IPI_mask(const struct cpumask *cpumask, int vector)
_flat_send_IPI_mask(mask, vector);
}

+static void flat_send_IPI_single(int cpu, int vector)
+{
+ unsigned long mask = cpumask_bits(cpumask_of(cpu))[0];
+
+ _flat_send_IPI_mask(mask, vector);
+}
+
static void
flat_send_IPI_mask_allbutself(const struct cpumask *cpumask, int vector)
{
@@ -132,7 +139,7 @@ static struct apic apic_flat __ro_after_init = {

.calc_dest_apicid = apic_flat_calc_apicid,

- .send_IPI = default_send_IPI_single,
+ .send_IPI = flat_send_IPI_single,
.send_IPI_mask = flat_send_IPI_mask,
.send_IPI_mask_allbutself = flat_send_IPI_mask_allbutself,
.send_IPI_allbutself = default_send_IPI_allbutself,
--
2.27.0