[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <Y6FJgh3fOYoF0wSV@MiWiFi-R3L-srv>
Date: Tue, 20 Dec 2022 13:34:58 +0800
From: Baoquan He <bhe@...hat.com>
To: linux-kernel@...r.kernel.org, Thomas Gleixner <tglx@...utronix.de>
Cc: x86@...nel.org, kexec@...ts.infradead.org
Subject: [PATCH] Revert "x86/apic/x2apic: Implement IPI shorthands support"
This reverts commit 43931d350f30c6cd8c2f498d54ef7d65750abc92.
On kvm guest with 4 cpus deployed, when adding 'nr_cpus=2' to normal
kernel's cmdline, and triggering crash to jump to kdump kernel, kdump
kernel will stably hang. Reverting commit 43931d350f30 ("x86/apic/x2apic:
Implement IPI shorthands support") can fix it.
The problem will disappear if removing 'nr_cpus=2' from normal kerne's
cmdline.
Tried on several bare metal systems, this issue can't be stably
reproduced. On several systems, kdump kernel can always succeed. On some
systems, kdump kernel randomly failed, not sure if it's the same issue
as the one on kvm guest. On some systems, there's another random hang
with tick_periodic() call trace, I will report it in another mail.
Signed-off-by: Baoquan He <bhe@...hat.com>
---
This is reproduced stably on kvm guest with Fedora. Attached the kernel
config for reference just in case.
arch/x86/kernel/apic/local.h | 1 -
arch/x86/kernel/apic/x2apic_cluster.c | 4 ++--
arch/x86/kernel/apic/x2apic_phys.c | 13 ++-----------
3 files changed, 4 insertions(+), 14 deletions(-)
diff --git a/arch/x86/kernel/apic/local.h b/arch/x86/kernel/apic/local.h
index a997d849509a..59b91f7708d8 100644
--- a/arch/x86/kernel/apic/local.h
+++ b/arch/x86/kernel/apic/local.h
@@ -24,7 +24,6 @@ unsigned int x2apic_get_apic_id(unsigned long id);
u32 x2apic_set_apic_id(unsigned int id);
int x2apic_phys_pkg_id(int initial_apicid, int index_msb);
void x2apic_send_IPI_self(int vector);
-void __x2apic_send_IPI_shorthand(int vector, u32 which);
/* IPI */
diff --git a/arch/x86/kernel/apic/x2apic_cluster.c b/arch/x86/kernel/apic/x2apic_cluster.c
index e696e22d0531..d95b49fac01a 100644
--- a/arch/x86/kernel/apic/x2apic_cluster.c
+++ b/arch/x86/kernel/apic/x2apic_cluster.c
@@ -90,12 +90,12 @@ x2apic_send_IPI_mask_allbutself(const struct cpumask *mask, int vector)
static void x2apic_send_IPI_allbutself(int vector)
{
- __x2apic_send_IPI_shorthand(vector, APIC_DEST_ALLBUT);
+ __x2apic_send_IPI_mask(cpu_online_mask, vector, APIC_DEST_ALLBUT);
}
static void x2apic_send_IPI_all(int vector)
{
- __x2apic_send_IPI_shorthand(vector, APIC_DEST_ALLINC);
+ __x2apic_send_IPI_mask(cpu_online_mask, vector, APIC_DEST_ALLINC);
}
static u32 x2apic_calc_apicid(unsigned int cpu)
diff --git a/arch/x86/kernel/apic/x2apic_phys.c b/arch/x86/kernel/apic/x2apic_phys.c
index 6bde05a86b4e..18c5201d1cb1 100644
--- a/arch/x86/kernel/apic/x2apic_phys.c
+++ b/arch/x86/kernel/apic/x2apic_phys.c
@@ -83,12 +83,12 @@ static void
static void x2apic_send_IPI_allbutself(int vector)
{
- __x2apic_send_IPI_shorthand(vector, APIC_DEST_ALLBUT);
+ __x2apic_send_IPI_mask(cpu_online_mask, vector, APIC_DEST_ALLBUT);
}
static void x2apic_send_IPI_all(int vector)
{
- __x2apic_send_IPI_shorthand(vector, APIC_DEST_ALLINC);
+ __x2apic_send_IPI_mask(cpu_online_mask, vector, APIC_DEST_ALLINC);
}
static void init_x2apic_ldr(void)
@@ -123,15 +123,6 @@ void __x2apic_send_IPI_dest(unsigned int apicid, int vector, unsigned int dest)
native_x2apic_icr_write(cfg, apicid);
}
-void __x2apic_send_IPI_shorthand(int vector, u32 which)
-{
- unsigned long cfg = __prepare_ICR(which, vector, 0);
-
- /* x2apic MSRs are special and need a special fence: */
- weak_wrmsr_fence();
- native_x2apic_icr_write(cfg, 0);
-}
-
unsigned int x2apic_get_apic_id(unsigned long id)
{
return id;
--
2.34.1
View attachment "config-kdump-failure-kvm-nr_cpus" of type "text/plain" (169743 bytes)
Powered by blists - more mailing lists