Wanpeng Li <kernel...@gmail.com> writes:

> From: Wanpeng Li <wanpen...@tencent.com>
>
> Commit 8566ac8b (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.
>
> We can observe 2.9% hackbench improvement for a 92 vCPUs guest on AMD 
> Rome Server.
>
> 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>
> ---
>  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..c20f127 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 (pause_filter_count && !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_thresh)
> +             kvm->arch.pause_in_guest = true;

Would it make sense to do

        if (!pause_filter_count || !pause_filter_thresh)
                kvm->arch.pause_in_guest = true;

here and simplify the condition in init_vmcb()?

> +
>       if (avic) {
>               int ret = avic_vm_init(kvm);
>               if (ret)

-- 
Vitaly

Reply via email to