Move .write_log_dirty() into kvm_x86_nested_ops to help differentiate it
from the non-nested dirty log hooks.  And because it's a nested-only
operation.

Signed-off-by: Sean Christopherson <sean.j.christopher...@intel.com>
---
 arch/x86/include/asm/kvm_host.h |  2 +-
 arch/x86/kvm/mmu/paging_tmpl.h  |  2 +-
 arch/x86/kvm/vmx/nested.c       | 38 +++++++++++++++++++++++++++++++++
 arch/x86/kvm/vmx/vmx.c          | 38 ---------------------------------
 4 files changed, 40 insertions(+), 40 deletions(-)

diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index 446ea70a554d..4e6219cb3933 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -1220,7 +1220,6 @@ struct kvm_x86_ops {
        void (*enable_log_dirty_pt_masked)(struct kvm *kvm,
                                           struct kvm_memory_slot *slot,
                                           gfn_t offset, unsigned long mask);
-       int (*write_log_dirty)(struct kvm_vcpu *vcpu, gpa_t l2_gpa);
 
        /* pmu operations of sub-arch */
        const struct kvm_pmu_ops *pmu_ops;
@@ -1281,6 +1280,7 @@ struct kvm_x86_nested_ops {
                         struct kvm_nested_state __user *user_kvm_nested_state,
                         struct kvm_nested_state *kvm_state);
        bool (*get_vmcs12_pages)(struct kvm_vcpu *vcpu);
+       int (*write_log_dirty)(struct kvm_vcpu *vcpu, gpa_t l2_gpa);
 
        int (*enable_evmcs)(struct kvm_vcpu *vcpu,
                            uint16_t *vmcs_version);
diff --git a/arch/x86/kvm/mmu/paging_tmpl.h b/arch/x86/kvm/mmu/paging_tmpl.h
index 60e7b2308876..c733196fd45b 100644
--- a/arch/x86/kvm/mmu/paging_tmpl.h
+++ b/arch/x86/kvm/mmu/paging_tmpl.h
@@ -260,7 +260,7 @@ static int FNAME(update_accessed_dirty_bits)(struct 
kvm_vcpu *vcpu,
                                !(pte & PT_GUEST_DIRTY_MASK)) {
                        trace_kvm_mmu_set_dirty_bit(table_gfn, index, 
sizeof(pte));
 #if PTTYPE == PTTYPE_EPT
-                       if (kvm_x86_ops.write_log_dirty(vcpu, addr))
+                       if (kvm_x86_ops.nested_ops->write_log_dirty(vcpu, addr))
                                return -EINVAL;
 #endif
                        pte |= PT_GUEST_DIRTY_MASK;
diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c
index adb11b504d5c..db9abcbeefd1 100644
--- a/arch/x86/kvm/vmx/nested.c
+++ b/arch/x86/kvm/vmx/nested.c
@@ -3205,6 +3205,43 @@ static bool nested_get_vmcs12_pages(struct kvm_vcpu 
*vcpu)
        return true;
 }
 
+static int nested_vmx_write_pml_buffer(struct kvm_vcpu *vcpu, gpa_t gpa)
+{
+       struct vmcs12 *vmcs12;
+       struct vcpu_vmx *vmx = to_vmx(vcpu);
+       gpa_t dst;
+
+       if (WARN_ON_ONCE(!is_guest_mode(vcpu)))
+               return 0;
+
+       if (WARN_ON_ONCE(vmx->nested.pml_full))
+               return 1;
+
+       /*
+        * Check if PML is enabled for the nested guest. Whether eptp bit 6 is
+        * set is already checked as part of A/D emulation.
+        */
+       vmcs12 = get_vmcs12(vcpu);
+       if (!nested_cpu_has_pml(vmcs12))
+               return 0;
+
+       if (vmcs12->guest_pml_index >= PML_ENTITY_NUM) {
+               vmx->nested.pml_full = true;
+               return 1;
+       }
+
+       gpa &= ~0xFFFull;
+       dst = vmcs12->pml_address + sizeof(u64) * vmcs12->guest_pml_index;
+
+       if (kvm_write_guest_page(vcpu->kvm, gpa_to_gfn(dst), &gpa,
+                                offset_in_page(dst), sizeof(gpa)))
+               return 0;
+
+       vmcs12->guest_pml_index--;
+
+       return 0;
+}
+
 /*
  * Intel's VMX Instruction Reference specifies a common set of prerequisites
  * for running VMX instructions (except VMXON, whose prerequisites are
@@ -6503,6 +6540,7 @@ struct kvm_x86_nested_ops vmx_nested_ops = {
        .get_state = vmx_get_nested_state,
        .set_state = vmx_set_nested_state,
        .get_vmcs12_pages = nested_get_vmcs12_pages,
+       .write_log_dirty = nested_vmx_write_pml_buffer,
        .enable_evmcs = nested_enable_evmcs,
        .get_evmcs_version = nested_get_evmcs_version,
 };
diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
index adf83047bb21..8bf06a59f356 100644
--- a/arch/x86/kvm/vmx/vmx.c
+++ b/arch/x86/kvm/vmx/vmx.c
@@ -7501,43 +7501,6 @@ static void vmx_flush_log_dirty(struct kvm *kvm)
        kvm_flush_pml_buffers(kvm);
 }
 
-static int vmx_write_pml_buffer(struct kvm_vcpu *vcpu, gpa_t gpa)
-{
-       struct vmcs12 *vmcs12;
-       struct vcpu_vmx *vmx = to_vmx(vcpu);
-       gpa_t dst;
-
-       if (WARN_ON_ONCE(!is_guest_mode(vcpu)))
-               return 0;
-
-       if (WARN_ON_ONCE(vmx->nested.pml_full))
-               return 1;
-
-       /*
-        * Check if PML is enabled for the nested guest. Whether eptp bit 6 is
-        * set is already checked as part of A/D emulation.
-        */
-       vmcs12 = get_vmcs12(vcpu);
-       if (!nested_cpu_has_pml(vmcs12))
-               return 0;
-
-       if (vmcs12->guest_pml_index >= PML_ENTITY_NUM) {
-               vmx->nested.pml_full = true;
-               return 1;
-       }
-
-       gpa &= ~0xFFFull;
-       dst = vmcs12->pml_address + sizeof(u64) * vmcs12->guest_pml_index;
-
-       if (kvm_write_guest_page(vcpu->kvm, gpa_to_gfn(dst), &gpa,
-                                offset_in_page(dst), sizeof(gpa)))
-               return 0;
-
-       vmcs12->guest_pml_index--;
-
-       return 0;
-}
-
 static void vmx_enable_log_dirty_pt_masked(struct kvm *kvm,
                                           struct kvm_memory_slot *memslot,
                                           gfn_t offset, unsigned long mask)
@@ -7966,7 +7929,6 @@ static struct kvm_x86_ops vmx_x86_ops __initdata = {
        .slot_disable_log_dirty = vmx_slot_disable_log_dirty,
        .flush_log_dirty = vmx_flush_log_dirty,
        .enable_log_dirty_pt_masked = vmx_enable_log_dirty_pt_masked,
-       .write_log_dirty = vmx_write_pml_buffer,
 
        .pre_block = vmx_pre_block,
        .post_block = vmx_post_block,
-- 
2.26.0

Reply via email to