From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752841AbdF0Nk5 (ORCPT ); Tue, 27 Jun 2017 09:40:57 -0400 Received: from mail-wm0-f67.google.com ([74.125.82.67]:36845 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753007AbdF0Nko (ORCPT ); Tue, 27 Jun 2017 09:40:44 -0400 Subject: Re: [PATCH v5 3/4] KVM: async_pf: Force a nested vmexit if the injected #PF is async_pf To: Wanpeng Li , linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: =?UTF-8?B?UmFkaW0gS3LEjW3DocWZ?= , Wanpeng Li References: <1498528021-5115-1-git-send-email-wanpeng.li@hotmail.com> <1498528021-5115-4-git-send-email-wanpeng.li@hotmail.com> From: Paolo Bonzini Message-ID: <18eb67d5-d426-e69d-49d5-d8c434f40da7@redhat.com> Date: Tue, 27 Jun 2017 15:40:41 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.0 MIME-Version: 1.0 In-Reply-To: <1498528021-5115-4-git-send-email-wanpeng.li@hotmail.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 27/06/2017 03:47, Wanpeng Li wrote: > -static int nested_vmx_check_exception(struct kvm_vcpu *vcpu, unsigned nr) > +static int nested_vmx_check_exception(struct kvm_vcpu *vcpu) > { > struct vmcs12 *vmcs12 = get_vmcs12(vcpu); > + unsigned int nr = vcpu->arch.exception.nr; > > - if (!(vmcs12->exception_bitmap & (1u << nr))) > + if (!((vmcs12->exception_bitmap & (1u << nr)) || > + (nr == PF_VECTOR && vcpu->arch.exception.async_page_fault))) > return 0; > > + if (vcpu->arch.exception.async_page_fault) { > + vmcs_write32(VM_EXIT_INTR_ERROR_CODE, vcpu->arch.exception.error_code); > + nested_vmx_vmexit(vcpu, EXIT_REASON_EXCEPTION_NMI, > + PF_VECTOR | INTR_TYPE_HARD_EXCEPTION | > + INTR_INFO_DELIVER_CODE_MASK | INTR_INFO_VALID_MASK, > + vcpu->arch.apf.nested_apf_token); > + return 1; > + } > + > nested_vmx_vmexit(vcpu, EXIT_REASON_EXCEPTION_NMI, > vmcs_read32(VM_EXIT_INTR_INFO), > vmcs_readl(EXIT_QUALIFICATION)); > @@ -2442,7 +2453,7 @@ static void vmx_queue_exception(struct kvm_vcpu *vcpu) > u32 intr_info = nr | INTR_INFO_VALID_MASK; > > if (!reinject && is_guest_mode(vcpu) && > - nested_vmx_check_exception(vcpu, nr)) > + nested_vmx_check_exception(vcpu)) > return; > > if (has_error_code) { The corresponding change for svm.c should be: diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 6e3095d1bad4..b92f56b98844 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -2391,15 +2391,19 @@ static int nested_svm_check_exception(struct vcpu_svm *svm, unsigned nr, if (!is_guest_mode(&svm->vcpu)) return 0; + vmexit = nested_svm_intercept(svm); + if (vmexit != NESTED_EXIT_DONE) + return 0; + svm->vmcb->control.exit_code = SVM_EXIT_EXCP_BASE + nr; svm->vmcb->control.exit_code_hi = 0; svm->vmcb->control.exit_info_1 = error_code; - svm->vmcb->control.exit_info_2 = svm->vcpu.arch.cr2; - - vmexit = nested_svm_intercept(svm); - if (vmexit == NESTED_EXIT_DONE) - svm->nested.exit_required = true; + if (svm->vcpu.arch.exception.nested_apf) + svm->vmcb->control.exit_info_2 = svm->vcpu.arch.apf.nested_apf_token; + else + svm->vmcb->control.exit_info_2 = svm->vcpu.arch.cr2; + svm->nested.exit_required = true; return vmexit; } @@ -2592,7 +2596,7 @@ static int nested_svm_intercept(struct vcpu_svm *svm) vmexit = NESTED_EXIT_DONE; /* async page fault always cause vmexit */ else if ((exit_code == SVM_EXIT_EXCP_BASE + PF_VECTOR) && - svm->apf_reason != 0) + svm->vcpu.arch.exception.nested_apf) vmexit = NESTED_EXIT_DONE; break; } (where I'm already using the "nested_apf" name I proposed in the other email. Paolo