summaryrefslogtreecommitdiff
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
parentb146a9b34aed3cfa6edc058830c906a2b718fba5 (diff)
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;
}