KVM: nVMX: Do not mark vmcs02->apic_access_page as dirty when unpinning
authorLiran Alon <liran.alon@oracle.com>
Wed, 20 Nov 2019 22:31:47 +0000 (00:31 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 21 Nov 2019 11:03:48 +0000 (12:03 +0100)
vmcs->apic_access_page is simply a token that the hypervisor puts into
the PFN of a 4KB EPTE (or PTE if using shadow-paging) that triggers
APIC-access VMExit or APIC virtualization logic whenever a CPU running
in VMX non-root mode read/write from/to this PFN.

As every write either triggers an APIC-access VMExit or write is
performed on vmcs->virtual_apic_page, the PFN pointed to by
vmcs->apic_access_page should never actually be touched by CPU.

Therefore, there is no need to mark vmcs02->apic_access_page as dirty
after unpin it on L2->L1 emulated VMExit or when L1 exit VMX operation.

Reviewed-by: Krish Sadhukhan <krish.sadhukhan@oracle.com>
Reviewed-by: Joao Martins <joao.m.martins@oracle.com>
Reviewed-by: Jim Mattson <jmattson@google.com>
Signed-off-by: Liran Alon <liran.alon@oracle.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/vmx/nested.c

index 5fb59be..783de6d 100644 (file)
@@ -268,7 +268,7 @@ static void free_nested(struct kvm_vcpu *vcpu)
        vmx->nested.cached_shadow_vmcs12 = NULL;
        /* Unpin physical memory we referred to in the vmcs02 */
        if (vmx->nested.apic_access_page) {
-               kvm_release_page_dirty(vmx->nested.apic_access_page);
+               kvm_release_page_clean(vmx->nested.apic_access_page);
                vmx->nested.apic_access_page = NULL;
        }
        kvm_vcpu_unmap(vcpu, &vmx->nested.virtual_apic_map, true);
@@ -3070,7 +3070,7 @@ static bool nested_get_vmcs12_pages(struct kvm_vcpu *vcpu)
                 * to it so we can release it later.
                 */
                if (vmx->nested.apic_access_page) { /* shouldn't happen */
-                       kvm_release_page_dirty(vmx->nested.apic_access_page);
+                       kvm_release_page_clean(vmx->nested.apic_access_page);
                        vmx->nested.apic_access_page = NULL;
                }
                page = kvm_vcpu_gpa_to_page(vcpu, vmcs12->apic_access_addr);
@@ -4267,7 +4267,7 @@ void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason,
 
        /* Unpin physical memory we referred to in vmcs02 */
        if (vmx->nested.apic_access_page) {
-               kvm_release_page_dirty(vmx->nested.apic_access_page);
+               kvm_release_page_clean(vmx->nested.apic_access_page);
                vmx->nested.apic_access_page = NULL;
        }
        kvm_vcpu_unmap(vcpu, &vmx->nested.virtual_apic_map, true);