ple_window is preserved in VMCS, so can write it only after a change. Do this by keeping a dirty bit. Signed-off-by: Radim Krčmář <rkrcmar@xxxxxxxxxx> --- arch/x86/kvm/vmx.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 1318232..f32415b 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -510,6 +510,7 @@ struct vcpu_vmx { /* Dynamic PLE window. */ int ple_window; + bool ple_window_dirty; }; enum segment_cache_field { @@ -4426,6 +4427,7 @@ static int vmx_vcpu_setup(struct vcpu_vmx *vmx) vmcs_write64(POSTED_INTR_DESC_ADDR, __pa((&vmx->pi_desc))); } + vmx->ple_window_dirty = ple_gap; if (ple_gap) { vmcs_write32(PLE_GAP, ple_gap); vmx->ple_window = ple_window; @@ -5741,6 +5743,9 @@ static void grow_ple_window(struct kvm_vcpu *vcpu) vmx->ple_window = __grow_ple_window(old); } while (read_seqretry(&ple_window_seqlock, seq)); + if (vmx->ple_window != old) + vmx->ple_window_dirty = true; + trace_kvm_ple_window_grow(vcpu->vcpu_id, vmx->ple_window, old); } @@ -5756,6 +5761,9 @@ static void shrink_ple_window(struct kvm_vcpu *vcpu) ple_window); } while (read_seqretry(&ple_window_seqlock, seq)); + if (vmx->ple_window != old) + vmx->ple_window_dirty = true; + trace_kvm_ple_window_shrink(vcpu->vcpu_id, vmx->ple_window, old); } @@ -7505,8 +7513,10 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu) if (vmx->emulation_required) return; - if (ple_gap) + if (vmx->ple_window_dirty) { + vmx->ple_window_dirty = false; vmcs_write32(PLE_WINDOW, vmx->ple_window); + } if (vmx->nested.sync_shadow_vmcs) { copy_vmcs12_to_shadow(vmx); -- 2.1.0 -- 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