• T
    x86/mm: Rework wbinvd, hlt operation in stop_this_cpu() · f23d74f6
    Tom Lendacky 提交于
    Some issues have been reported with the for loop in stop_this_cpu() that
    issues the 'wbinvd; hlt' sequence.  Reverting this sequence to halt()
    has been shown to resolve the issue.
    
    However, the wbinvd is needed when running with SME.  The reason for the
    wbinvd is to prevent cache flush races between encrypted and non-encrypted
    entries that have the same physical address.  This can occur when
    kexec'ing from memory encryption active to inactive or vice-versa.  The
    important thing is to not have outside of kernel text memory references
    (such as stack usage), so the usage of the native_*() functions is needed
    since these expand as inline asm sequences.  So instead of reverting the
    change, rework the sequence.
    
    Move the wbinvd instruction outside of the for loop as native_wbinvd()
    and make its execution conditional on X86_FEATURE_SME.  In the for loop,
    change the asm 'wbinvd; hlt' sequence back to a halt sequence but use
    the native_halt() call.
    
    Fixes: bba4ed01 ("x86/mm, kexec: Allow kexec to be used with SME")
    Reported-by: NDave Young <dyoung@redhat.com>
    Signed-off-by: NTom Lendacky <thomas.lendacky@amd.com>
    Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
    Tested-by: NDave Young <dyoung@redhat.com>
    Cc: Juergen Gross <jgross@suse.com>
    Cc: Tony Luck <tony.luck@intel.com>
    Cc: Yu Chen <yu.c.chen@intel.com>
    Cc: Baoquan He <bhe@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: kexec@lists.infradead.org
    Cc: ebiederm@redhat.com
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Rui Zhang <rui.zhang@intel.com>
    Cc: Arjan van de Ven <arjan@linux.intel.com>
    Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Cc: Dan Williams <dan.j.williams@intel.com>
    Cc: stable@vger.kernel.org
    Link: https://lkml.kernel.org/r/20180117234141.21184.44067.stgit@tlendack-t1.amdoffice.net
    f23d74f6
process.c 15.3 KB