Re: [PATCH 5/5] kvm/svm: kick L2 guest to L1 by ready async_pf

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




----- 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



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux