From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paolo Bonzini Subject: Re: [PATCH 5/5] kvm/svm: kick L2 guest to L1 by ready async_pf Date: Fri, 2 Dec 2016 04:35:24 -0500 (EST) Message-ID: <788012052.1167895.1480671324974.JavaMail.zimbra@redhat.com> References: <20161202084754.22860-1-rkagan@virtuozzo.com> <20161202084754.22860-6-rkagan@virtuozzo.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8BIT Cc: Radim =?utf-8?B?S3LEjW3DocWZ?= , kvm@vger.kernel.org, Denis Lunev To: Roman Kagan Return-path: Received: from mx3-phx2.redhat.com ([209.132.183.24]:60378 "EHLO mx3-phx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759240AbcLBJf0 (ORCPT ); Fri, 2 Dec 2016 04:35:26 -0500 In-Reply-To: <20161202084754.22860-6-rkagan@virtuozzo.com> Sender: kvm-owner@vger.kernel.org List-ID: ----- Original Message ----- > From: "Roman Kagan" > To: "Radim Krčmář" , "Paolo Bonzini" , kvm@vger.kernel.org > Cc: "Denis Lunev" , "Roman Kagan" > Sent: Friday, December 2, 2016 9:47:54 AM > Subject: [PATCH 5/5] kvm/svm: kick L2 guest to L1 by ready async_pf > > When async pagefault is resolved vCPU may be executing L2 guest. > > In order to allow L1 take better scheduling decisions in such cases, > make L2 exit to L1 on a fake external interupt, without actually > injecting it (unless L2 has other reasons to vmexit). > > This patch does that for x86/AMD. > > Signed-off-by: Roman Kagan > --- > Note 1: I didn't have a chance to test this; I'll do when I get access to an > AMD machine and let you know if anything goes wrong > > Note 2: I mostly modelled this patch after the one for vmx but is looks not > very appealing for svm. I'd appreciate being pointed at a better location > where to stick the fake external interrupt vmexit. This should not be necessary, SVM has a different mechanism (which requires L1 cooperation) to handle async page faults. Paolo > > arch/x86/kvm/svm.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c > index 8ca1eca..1f6ae15 100644 > --- a/arch/x86/kvm/svm.c > +++ b/arch/x86/kvm/svm.c > @@ -3723,6 +3723,15 @@ static int mwait_interception(struct vcpu_svm *svm) > return nop_interception(svm); > } > > +static int svm_check_nested_events(struct kvm_vcpu *vcpu, bool > external_intr) > +{ > + struct vcpu_svm *svm = to_svm(vcpu); > + > + if (kvm_async_pf_has_ready(vcpu)) > + nested_svm_intr(svm); > + return 0; > +} > + > enum avic_ipi_failure_cause { > AVIC_IPI_FAILURE_INVALID_INT_TYPE, > AVIC_IPI_FAILURE_TARGET_NOT_RUNNING, > @@ -5406,6 +5415,7 @@ static struct kvm_x86_ops svm_x86_ops __ro_after_init = > { > > .check_intercept = svm_check_intercept, > .handle_external_intr = svm_handle_external_intr, > + .check_nested_events = svm_check_nested_events, > > .sched_in = svm_sched_in, > > -- > 2.9.3 > >