From: Ștefan Șicleru <ssicleru@xxxxxxxxxxxxxxx> If the guest has EPTP switching capabilities with VMFUNC, read the current view from VMCS instead of walking through the EPTP list when #VE support is active. Signed-off-by: Ștefan Șicleru <ssicleru@xxxxxxxxxxxxxxx> Signed-off-by: Adalbert Lazăr <alazar@xxxxxxxxxxxxxxx> --- arch/x86/kvm/vmx/vmx.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index 96aa4b7e2857..035f6c43a2a4 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -6269,15 +6269,21 @@ void dump_vmcs(void) static unsigned int update_ept_view(struct vcpu_vmx *vmx) { - u64 *eptp_list = phys_to_virt(page_to_phys(vmx->eptp_list_pg)); - u64 eptp = vmcs_read64(EPT_POINTER); - unsigned int view; + /* if #VE support is active, read the EPT index from VMCS */ + if (kvm_ve_supported && + secondary_exec_controls_get(vmx) & SECONDARY_EXEC_EPT_VE) { + vmx->view = vmcs_read16(EPTP_INDEX); + } else { + u64 *eptp_list = phys_to_virt(page_to_phys(vmx->eptp_list_pg)); + u64 eptp = vmcs_read64(EPT_POINTER); + unsigned int view; - for (view = 0; view < KVM_MAX_EPT_VIEWS; view++) - if (eptp_list[view] == eptp) { - vmx->view = view; - break; - } + for (view = 0; view < KVM_MAX_EPT_VIEWS; view++) + if (eptp_list[view] == eptp) { + vmx->view = view; + break; + } + } return vmx->view; } _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/virtualization