if (!nested_vmcb_needs_vls_intercept(svm))
                vmcb02->control.virt_ext |= VIRTUAL_VMLOAD_VMSAVE_ENABLE_MASK;
 
+       if (kvm_pause_in_guest(svm->vcpu.kvm)) {
+               /* use guest values since host doesn't use them */
+               vmcb02->control.pause_filter_count =
+                               svm->pause_filter_enabled ?
+                               svm->nested.ctl.pause_filter_count : 0;
+
+               vmcb02->control.pause_filter_thresh =
+                               svm->pause_threshold_enabled ?
+                               svm->nested.ctl.pause_filter_thresh : 0;
+
+       } else if (!vmcb12_is_intercept(&svm->nested.ctl, INTERCEPT_PAUSE)) {
+               /* use host values when guest doesn't use them */
+               vmcb02->control.pause_filter_count = vmcb01->control.pause_filter_count;
+               vmcb02->control.pause_filter_thresh = vmcb01->control.pause_filter_thresh;
+       } else {
+               /*
+                * Intercept every PAUSE otherwise and
+                * ignore both host and guest values
+                */
+               vmcb02->control.pause_filter_count = 0;
+               vmcb02->control.pause_filter_thresh = 0;
+       }
+
        nested_svm_transition_tlb_flush(vcpu);
 
        /* Enter Guest-Mode */
        vmcb12->control.event_inj         = svm->nested.ctl.event_inj;
        vmcb12->control.event_inj_err     = svm->nested.ctl.event_inj_err;
 
+       if (!kvm_pause_in_guest(vcpu->kvm) && vmcb02->control.pause_filter_count)
+               vmcb01->control.pause_filter_count = vmcb02->control.pause_filter_count;
+
        nested_svm_copy_common_state(svm->nested.vmcb02.ptr, svm->vmcb01.ptr);
 
        svm_switch_vmcb(svm, &svm->vmcb01);
 
        struct vmcb_control_area *control = &svm->vmcb->control;
        int old = control->pause_filter_count;
 
+       if (kvm_pause_in_guest(vcpu->kvm) || !old)
+               return;
+
        control->pause_filter_count = __grow_ple_window(old,
                                                        pause_filter_count,
                                                        pause_filter_count_grow,
        struct vmcb_control_area *control = &svm->vmcb->control;
        int old = control->pause_filter_count;
 
+       if (kvm_pause_in_guest(vcpu->kvm) || !old)
+               return;
+
        control->pause_filter_count =
                                __shrink_ple_window(old,
                                                    pause_filter_count,
 static int pause_interception(struct kvm_vcpu *vcpu)
 {
        bool in_kernel;
-
        /*
         * CPL is not made available for an SEV-ES guest, therefore
         * vcpu->arch.preempted_in_kernel can never be true.  Just
         */
        in_kernel = !sev_es_guest(vcpu->kvm) && svm_get_cpl(vcpu) == 0;
 
-       if (!kvm_pause_in_guest(vcpu->kvm))
-               grow_ple_window(vcpu);
+       grow_ple_window(vcpu);
 
        kvm_vcpu_on_spin(vcpu, in_kernel);
        return kvm_skip_emulated_instruction(vcpu);
 
        svm->v_vmload_vmsave_enabled = vls && guest_cpuid_has(vcpu, X86_FEATURE_V_VMSAVE_VMLOAD);
 
+       svm->pause_filter_enabled = kvm_cpu_cap_has(X86_FEATURE_PAUSEFILTER) &&
+                       guest_cpuid_has(vcpu, X86_FEATURE_PAUSEFILTER);
+
+       svm->pause_threshold_enabled = kvm_cpu_cap_has(X86_FEATURE_PFTHRESHOLD) &&
+                       guest_cpuid_has(vcpu, X86_FEATURE_PFTHRESHOLD);
+
        svm_recalc_instruction_intercepts(vcpu, svm);
 
        /* For sev guests, the memory encryption bit is not reserved in CR3.  */
                if (lbrv)
                        kvm_cpu_cap_set(X86_FEATURE_LBRV);
 
+               if (boot_cpu_has(X86_FEATURE_PAUSEFILTER))
+                       kvm_cpu_cap_set(X86_FEATURE_PAUSEFILTER);
+
+               if (boot_cpu_has(X86_FEATURE_PFTHRESHOLD))
+                       kvm_cpu_cap_set(X86_FEATURE_PFTHRESHOLD);
+
                /* Nested VM can receive #VMEXIT instead of triggering #GP */
                kvm_cpu_cap_set(X86_FEATURE_SVME_ADDR_CHK);
        }