Patch "x86/apic: Fake primary thread mask for XEN/PV" has been added to the 6.6-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    x86/apic: Fake primary thread mask for XEN/PV

to the 6.6-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     x86-apic-fake-primary-thread-mask-for-xen-pv.patch
and it can be found in the queue-6.6 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit a3fd29a57cd7a5cc4db742613ad6c1c986a84581
Author: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
Date:   Mon Aug 14 10:18:28 2023 +0200

    x86/apic: Fake primary thread mask for XEN/PV
    
    [ Upstream commit 965e05ff8af98c44f9937366715c512000373164 ]
    
    The SMT control mechanism got added as speculation attack vector
    mitigation. The implemented logic relies on the primary thread mask to
    be set up properly.
    
    This turns out to be an issue with XEN/PV guests because their CPU hotplug
    mechanics do not enumerate APICs and therefore the mask is never correctly
    populated.
    
    This went unnoticed so far because by chance XEN/PV ends up with
    smp_num_siblings == 2. So cpu_smt_control stays at its default value
    CPU_SMT_ENABLED and the primary thread mask is never evaluated in the
    context of CPU hotplug.
    
    This stopped "working" with the upcoming overhaul of the topology
    evaluation which legitimately provides a fake topology for XEN/PV. That
    sets smp_num_siblings to 1, which causes the core CPU hot-plug core to
    refuse to bring up the APs.
    
    This happens because cpu_smt_control is set to CPU_SMT_NOT_SUPPORTED which
    causes cpu_bootable() to evaluate the unpopulated primary thread mask with
    the conclusion that all non-boot CPUs are not valid to be plugged.
    
    The core code has already been made more robust against this kind of fail,
    but the primary thread mask really wants to be populated to avoid other
    issues all over the place.
    
    Just fake the mask by pretending that all XEN/PV vCPUs are primary threads,
    which is consistent because all of XEN/PVs topology is fake or non-existent.
    
    Fixes: 6a4d2657e048 ("x86/smp: Provide topology_is_primary_thread()")
    Fixes: f54d4434c281 ("x86/apic: Provide cpu_primary_thread mask")
    Reported-by: Juergen Gross <jgross@xxxxxxxx>
    Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
    Tested-by: Juergen Gross <jgross@xxxxxxxx>
    Tested-by: Sohil Mehta <sohil.mehta@xxxxxxxxx>
    Tested-by: Michael Kelley <mikelley@xxxxxxxxxxxxx>
    Tested-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx>
    Tested-by: Zhang Rui <rui.zhang@xxxxxxxxx>
    Acked-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20230814085112.210011520@xxxxxxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index 760adac3d1a82..3cdf48493546d 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -36,6 +36,8 @@
 #include <linux/smp.h>
 #include <linux/mm.h>
 
+#include <xen/xen.h>
+
 #include <asm/trace/irq_vectors.h>
 #include <asm/irq_remapping.h>
 #include <asm/pc-conf-reg.h>
@@ -2344,6 +2346,15 @@ static int __init smp_init_primary_thread_mask(void)
 {
 	unsigned int cpu;
 
+	/*
+	 * XEN/PV provides either none or useless topology information.
+	 * Pretend that all vCPUs are primary threads.
+	 */
+	if (xen_pv_domain()) {
+		cpumask_copy(&__cpu_primary_thread_mask, cpu_possible_mask);
+		return 0;
+	}
+
 	for (cpu = 0; cpu < nr_logical_cpuids; cpu++)
 		cpu_mark_primary_thread(cpu, cpuid_to_apicid[cpu]);
 	return 0;



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux