On 31/07/20 05:12, Wanpeng Li wrote:
> From: Wanpeng Li <wanpen...@tencent.com>
> 
> 'Commit 8566ac8b8e7c ("KVM: SVM: Implement pause loop exit logic in SVM")' 
> drops disable pause loop exit/pause filtering capability completely, I 
> guess it is a merge fault by Radim since disable vmexits capabilities and 
> pause loop exit for SVM patchsets are merged at the same time. This patch 
> reintroduces the disable pause loop exit/pause filtering capability support.
> 
> Reported-by: Haiwei Li <lihai...@tencent.com>
> Tested-by: Haiwei Li <lihai...@tencent.com>
> Fixes: 8566ac8b (KVM: SVM: Implement pause loop exit logic in SVM)
> Signed-off-by: Wanpeng Li <wanpen...@tencent.com>
> ---
> v2 -> v3:
>  * simplify the condition in init_vmcb() 
> 
>  arch/x86/kvm/svm/svm.c | 9 ++++++---
>  1 file changed, 6 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
> index c0da4dd..bf77f90 100644
> --- a/arch/x86/kvm/svm/svm.c
> +++ b/arch/x86/kvm/svm/svm.c
> @@ -1090,7 +1090,7 @@ static void init_vmcb(struct vcpu_svm *svm)
>       svm->nested.vmcb = 0;
>       svm->vcpu.arch.hflags = 0;
>  
> -     if (pause_filter_count) {
> +     if (!kvm_pause_in_guest(svm->vcpu.kvm)) {
>               control->pause_filter_count = pause_filter_count;
>               if (pause_filter_thresh)
>                       control->pause_filter_thresh = pause_filter_thresh;
> @@ -2693,7 +2693,7 @@ static int pause_interception(struct vcpu_svm *svm)
>       struct kvm_vcpu *vcpu = &svm->vcpu;
>       bool in_kernel = (svm_get_cpl(vcpu) == 0);
>  
> -     if (pause_filter_thresh)
> +     if (!kvm_pause_in_guest(vcpu->kvm))
>               grow_ple_window(vcpu);
>  
>       kvm_vcpu_on_spin(vcpu, in_kernel);
> @@ -3780,7 +3780,7 @@ static void svm_handle_exit_irqoff(struct kvm_vcpu 
> *vcpu)
>  
>  static void svm_sched_in(struct kvm_vcpu *vcpu, int cpu)
>  {
> -     if (pause_filter_thresh)
> +     if (!kvm_pause_in_guest(vcpu->kvm))
>               shrink_ple_window(vcpu);
>  }
>  
> @@ -3958,6 +3958,9 @@ static void svm_vm_destroy(struct kvm *kvm)
>  
>  static int svm_vm_init(struct kvm *kvm)
>  {
> +     if (!pause_filter_count || !pause_filter_thresh)
> +             kvm->arch.pause_in_guest = true;
> +
>       if (avic) {
>               int ret = avic_vm_init(kvm);
>               if (ret)
> 

Queued all three, thanks.  Please do send a testcase for patch 1
however, I only queued it in order to have it in 5.8.

Paolo

Reply via email to