aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJames Houghton <jthoughton@google.com>2025-02-04 00:40:33 +0000
committerSean Christopherson <seanjc@google.com>2025-02-14 07:17:23 -0800
commite25c2332346fbd4814d5c9d3d25ba3d0f9646e06 (patch)
tree9324ece676aac7710a14ec6904ed58619290cdb0
parentKVM: x86/mmu: Age TDP MMU SPTEs without holding mmu_lock (diff)
downloadwireguard-linux-e25c2332346fbd4814d5c9d3d25ba3d0f9646e06.tar.xz
wireguard-linux-e25c2332346fbd4814d5c9d3d25ba3d0f9646e06.zip
KVM: x86/mmu: Skip shadow MMU test_young if TDP MMU reports page as young
Reorder the processing of the TDP MMU versus the shadow MMU when aging SPTEs, and skip the shadow MMU entirely in the test-only case if the TDP MMU reports that the page is young, i.e. completely avoid taking mmu_lock if the TDP MMU SPTE is young. Swap the order for the test-and-age helper as well for consistency. Signed-off-by: James Houghton <jthoughton@google.com> Acked-by: Yu Zhao <yuzhao@google.com> Link: https://lore.kernel.org/r/20250204004038.1680123-7-jthoughton@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
-rw-r--r--arch/x86/kvm/mmu/mmu.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
index b73b3c12f76f..3fc461ebaf05 100644
--- a/arch/x86/kvm/mmu/mmu.c
+++ b/arch/x86/kvm/mmu/mmu.c
@@ -1592,15 +1592,15 @@ bool kvm_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range)
{
bool young = false;
+ if (tdp_mmu_enabled)
+ young = kvm_tdp_mmu_age_gfn_range(kvm, range);
+
if (kvm_memslots_have_rmaps(kvm)) {
write_lock(&kvm->mmu_lock);
- young = kvm_rmap_age_gfn_range(kvm, range, false);
+ young |= kvm_rmap_age_gfn_range(kvm, range, false);
write_unlock(&kvm->mmu_lock);
}
- if (tdp_mmu_enabled)
- young |= kvm_tdp_mmu_age_gfn_range(kvm, range);
-
return young;
}
@@ -1608,15 +1608,15 @@ bool kvm_test_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range)
{
bool young = false;
- if (kvm_memslots_have_rmaps(kvm)) {
+ if (tdp_mmu_enabled)
+ young = kvm_tdp_mmu_test_age_gfn(kvm, range);
+
+ if (!young && kvm_memslots_have_rmaps(kvm)) {
write_lock(&kvm->mmu_lock);
- young = kvm_rmap_age_gfn_range(kvm, range, true);
+ young |= kvm_rmap_age_gfn_range(kvm, range, true);
write_unlock(&kvm->mmu_lock);
}
- if (tdp_mmu_enabled)
- young |= kvm_tdp_mmu_test_age_gfn(kvm, range);
-
return young;
}