----- Original Message ----- > From: "Roman Kagan" <rkagan@xxxxxxxxxxxxx> > To: "Radim Krčmář" <rkrcmar@xxxxxxxxxx>, "Paolo Bonzini" <pbonzini@xxxxxxxxxx>, kvm@xxxxxxxxxxxxxxx > Cc: "Denis Lunev" <den@xxxxxxxxxxxxx>, "Roman Kagan" <rkagan@xxxxxxxxxxxxx> > 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 <rkagan@xxxxxxxxxxxxx> > --- > 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 > > -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html