If the ldr value is read out to zero, it does not call avic_ldr_write to update the virtual register, but the variable ldr_reg is updated.
Fixes: 98d90582be2e ("SVM: Fix AVIC DFR and LDR handling") Signed-off-by: Peng Hao <richard.p...@oppo.com> --- arch/x86/kvm/svm/avic.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index 8c550999ace0..318735e0f2d0 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -417,7 +417,6 @@ static void avic_invalidate_logical_id_entry(struct kvm_vcpu *vcpu) static int avic_handle_ldr_update(struct kvm_vcpu *vcpu) { - int ret = 0; struct vcpu_svm *svm = to_svm(vcpu); u32 ldr = kvm_lapic_get_reg(vcpu->arch.apic, APIC_LDR); u32 id = kvm_xapic_id(vcpu->arch.apic); @@ -427,13 +426,16 @@ static int avic_handle_ldr_update(struct kvm_vcpu *vcpu) avic_invalidate_logical_id_entry(vcpu); - if (ldr) + if (ldr) { + int ret; ret = avic_ldr_write(vcpu, id, ldr); - if (!ret) - svm->ldr_reg = ldr; - - return ret; + if (!ret) + svm->ldr_reg = ldr; + else + return ret; + } + return 0; } static int avic_handle_apic_id_update(struct kvm_vcpu *vcpu) -- 2.18.4