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

[xen staging] x86/x2APIC: correct cluster tracking upon CPUs going down for S3



commit ad3ff7b4279d16c91c23cda6e8be5bc670b25c9a
Author:     Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Mon Aug 26 10:30:40 2024 +0200
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Mon Aug 26 10:30:40 2024 +0200

    x86/x2APIC: correct cluster tracking upon CPUs going down for S3
    
    Downing CPUs for S3 is somewhat special: Since we can expect the system
    to come back up in exactly the same hardware configuration, per-CPU data
    for the secondary CPUs isn't de-allocated (and then cleared upon re-
    allocation when the CPUs are being brought back up). Therefore the
    cluster_cpus per-CPU pointer will retain its value for all CPUs other
    than the final one in a cluster (i.e. in particular for all CPUs in the
    same cluster as CPU0). That, however, is in conflict with the assertion
    early in init_apic_ldr_x2apic_cluster().
    
    Note that the issue is avoided on Intel hardware, where we park CPUs
    instead of bringing them down.
    
    Extend the bypassing of the freeing to the suspend case, thus making
    suspend/resume also a tiny bit faster.
    
    Fixes: 2e6c8f182c9c ("x86: distinguish CPU offlining from CPU removal")
    Reported-by: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
    Tested-by: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
    Acked-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
 xen/arch/x86/genapic/x2apic.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/xen/arch/x86/genapic/x2apic.c b/xen/arch/x86/genapic/x2apic.c
index 371dd100c7..d531035fa4 100644
--- a/xen/arch/x86/genapic/x2apic.c
+++ b/xen/arch/x86/genapic/x2apic.c
@@ -228,7 +228,8 @@ static int cf_check update_clusterinfo(
     case CPU_UP_CANCELED:
     case CPU_DEAD:
     case CPU_REMOVE:
-        if ( park_offline_cpus == (action != CPU_REMOVE) )
+        if ( park_offline_cpus == (action != CPU_REMOVE) ||
+             system_state == SYS_STATE_suspend )
             break;
         if ( per_cpu(cluster_cpus, cpu) )
         {
--
generated by git-patchbot for /home/xen/git/xen.git#staging



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.