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

[xen stable-4.14] x86/xstate: reset cached register values on resume



commit 3d031d9e79481768abf93c1aab30116806eb604f
Author:     Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
AuthorDate: Fri Nov 19 09:40:44 2021 +0100
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Fri Nov 19 09:40:44 2021 +0100

    x86/xstate: reset cached register values on resume
    
    set_xcr0() and set_msr_xss() use cached value to avoid setting the
    register to the same value over and over. But suspend/resume implicitly
    reset the registers and since percpu areas are not deallocated on
    suspend anymore, the cache gets stale.
    Reset the cache on resume, to ensure the next write will really hit the
    hardware. Choose value 0, as it will never be a legitimate write to
    those registers - and so, will force write (and cache update).
    
    Note the cache is used io get_xcr0() and get_msr_xss() too, but:
    - set_xcr0() is called few lines below in xstate_init(), so it will
      update the cache with appropriate value
    - get_msr_xss() is not used anywhere - and thus not before any
      set_msr_xss() that will fill the cache
    
    Fixes: aca2a985a55a "xen: don't free percpu areas during suspend"
    Signed-off-by: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
    Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
    master commit: f7f4a523927fa4c7598e4647a16bc3e3cf8009d0
    master date: 2021-11-04 14:42:37 +0100
---
 xen/arch/x86/xstate.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/xen/arch/x86/xstate.c b/xen/arch/x86/xstate.c
index 3794d9a5a5..3bcc523f80 100644
--- a/xen/arch/x86/xstate.c
+++ b/xen/arch/x86/xstate.c
@@ -608,6 +608,13 @@ void xstate_init(struct cpuinfo_x86 *c)
         return;
     }
 
+    /*
+     * Zap the cached values to make set_xcr0() and set_msr_xss() really
+     * write it.
+     */
+    this_cpu(xcr0) = 0;
+    this_cpu(xss) = ~0;
+
     cpuid_count(XSTATE_CPUID, 0, &eax, &ebx, &ecx, &edx);
 
     BUG_ON((eax & XSTATE_FP_SSE) != XSTATE_FP_SSE);
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.14



 


Rackspace

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