Patch "KVM: x86: Do not unload MMU roots when only toggling CR0.WP with TDP enabled" has been added to the 6.1-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

    KVM: x86: Do not unload MMU roots when only toggling CR0.WP with TDP enabled

to the 6.1-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:
     kvm-x86-do-not-unload-mmu-roots-when-only-toggling-c.patch
and it can be found in the queue-6.1 subdirectory.

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



commit ce5a0367d81a5b34fd37af1ad992a67511c42198
Author: Mathias Krause <minipli@xxxxxxxxxxxxxx>
Date:   Mon May 8 17:45:59 2023 +0200

    KVM: x86: Do not unload MMU roots when only toggling CR0.WP with TDP enabled
    
    [ Upstream commit 01b31714bd90be2784f7145bf93b7f78f3d081e1 ]
    
    There is no need to unload the MMU roots with TDP enabled when only
    CR0.WP has changed -- the paging structures are still valid, only the
    permission bitmap needs to be updated.
    
    One heavy user of toggling CR0.WP is grsecurity's KERNEXEC feature to
    implement kernel W^X.
    
    The optimization brings a huge performance gain for this case as the
    following micro-benchmark running 'ssdd 10 50000' from rt-tests[1] on a
    grsecurity L1 VM shows (runtime in seconds, lower is better):
    
                           legacy     TDP    shadow
    kvm-x86/next@d8708b     8.43s    9.45s    70.3s
                 +patch     5.39s    5.63s    70.2s
    
    For legacy MMU this is ~36% faster, for TDP MMU even ~40% faster. Also
    TDP and legacy MMU now both have a similar runtime which vanishes the
    need to disable TDP MMU for grsecurity.
    
    Shadow MMU sees no measurable difference and is still slow, as expected.
    
    [1] https://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git
    
    Signed-off-by: Mathias Krause <minipli@xxxxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20230322013731.102955-3-minipli@xxxxxxxxxxxxxx
    Co-developed-by: Sean Christopherson <seanjc@xxxxxxxxxx>
    Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx>
    Signed-off-by: Mathias Krause <minipli@xxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 3463ef7f30196..d7af225b63d89 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -910,6 +910,18 @@ EXPORT_SYMBOL_GPL(load_pdptrs);
 
 void kvm_post_set_cr0(struct kvm_vcpu *vcpu, unsigned long old_cr0, unsigned long cr0)
 {
+	/*
+	 * CR0.WP is incorporated into the MMU role, but only for non-nested,
+	 * indirect shadow MMUs.  If TDP is enabled, the MMU's metadata needs
+	 * to be updated, e.g. so that emulating guest translations does the
+	 * right thing, but there's no need to unload the root as CR0.WP
+	 * doesn't affect SPTEs.
+	 */
+	if (tdp_enabled && (cr0 ^ old_cr0) == X86_CR0_WP) {
+		kvm_init_mmu(vcpu);
+		return;
+	}
+
 	if ((cr0 ^ old_cr0) & X86_CR0_PG) {
 		kvm_clear_async_pf_completion_queue(vcpu);
 		kvm_async_pf_hash_reset(vcpu);



[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