]> git.baikalelectronics.ru Git - kernel.git/commitdiff
KVM: x86/mmu: remove ept_ad field
authorPaolo Bonzini <pbonzini@redhat.com>
Thu, 10 Feb 2022 12:32:51 +0000 (07:32 -0500)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 29 Apr 2022 16:49:54 +0000 (12:49 -0400)
The ept_ad field is used during page walk to determine if the guest PTEs
have accessed and dirty bits.  In the MMU role, the ad_disabled
bit represents whether the *shadow* PTEs have the bits, so it
would be incorrect to replace PT_HAVE_ACCESSED_DIRTY with just
!mmu->mmu_role.base.ad_disabled.

However, the similar field in the CPU mode, ad_disabled, is initialized
correctly: to the opposite value of ept_ad for shadow EPT, and zero
for non-EPT guest paging modes (which always have A/D bits).  It is
therefore possible to compute PT_HAVE_ACCESSED_DIRTY from the CPU mode,
like other page-format fields; it just has to be inverted to account
for the different polarity.

In fact, now that the CPU mode is distinct from the MMU roles, it would
even be possible to remove PT_HAVE_ACCESSED_DIRTY macro altogether, and
use !mmu->cpu_role.base.ad_disabled instead.  I am not doing this because
the macro has a small effect in terms of dead code elimination:

   text    data     bss     dec     hex
 103544   16665     112  120321   1d601    # as of this patch
 103746   16665     112  120523   1d6cb    # without PT_HAVE_ACCESSED_DIRTY

Reviewed-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/include/asm/kvm_host.h
arch/x86/kvm/mmu/mmu.c
arch/x86/kvm/mmu/paging_tmpl.h

index 50edf52a3ef6554cecce852e586adf3f6b7e22a6..a299236cfde53bef14cbf8a75627d91afa586620 100644 (file)
@@ -442,7 +442,6 @@ struct kvm_mmu {
        union kvm_mmu_role mmu_role;
        u8 root_level;
        u8 shadow_root_level;
-       u8 ept_ad;
        bool direct_map;
 
        /*
index 2ced494527f04600da60651c28a5968dd5c69a5e..86d4ee6ea0f9c13b8da241376453ee6eecedf2b3 100644 (file)
@@ -5007,7 +5007,6 @@ void kvm_init_shadow_ept_mmu(struct kvm_vcpu *vcpu, bool execonly,
 
                context->shadow_root_level = level;
 
-               context->ept_ad = accessed_dirty;
                context->page_fault = ept_page_fault;
                context->gva_to_gpa = ept_gva_to_gpa;
                context->sync_page = ept_sync_page;
index 56544c542d0520a2528cf8363d9f322d06bcc392..298e502286cf22f8fea6fe44e4653538eefddd7c 100644 (file)
@@ -63,7 +63,7 @@
        #define PT_LEVEL_BITS PT64_LEVEL_BITS
        #define PT_GUEST_DIRTY_SHIFT 9
        #define PT_GUEST_ACCESSED_SHIFT 8
-       #define PT_HAVE_ACCESSED_DIRTY(mmu) ((mmu)->ept_ad)
+       #define PT_HAVE_ACCESSED_DIRTY(mmu) (!(mmu)->cpu_role.base.ad_disabled)
        #ifdef CONFIG_X86_64
        #define CMPXCHG "cmpxchgq"
        #endif