• Yuan ZhaoXiong's avatar
    KVM: x86: fix APICv/x2AVIC disabled when vm reboot by itself · ef407577
    Yuan ZhaoXiong authored
    When a VM reboots itself, the reset process will result in
    an ioctl(KVM_SET_LAPIC, ...) to disable x2APIC mode and set
    the xAPIC id of the vCPU to its default value, which is the
    vCPU id.
    
    That will be handled in KVM as follows:
    
         kvm_vcpu_ioctl_set_lapic
           kvm_apic_set_state
    	  kvm_lapic_set_base  =>  disable X2APIC mode
    	    kvm_apic_state_fixup
    	      kvm_lapic_xapic_id_updated
    	        kvm_xapic_id(apic) != apic->vcpu->vcpu_id
    		kvm_set_apicv_inhibit(APICV_INHIBIT_REASON_APIC_ID_MODIFIED)
    	   memcpy(vcpu->arch.apic->regs, s->regs, sizeof(*s))  => update APIC_ID
    
    When kvm_apic_set_state invokes kvm_lapic_set_base to disable
    x2APIC mode, the old 32-bit x2APIC id is still present rather
    than the 8-bit xAPIC id.  kvm_lapic_xapic_id_updated will set the
    APICV_INHIBIT_REASON_APIC_ID_MODIFIED bit and disable APICv/x2AVIC.
    
    Instead, kvm_lapic_xapic_id_updated must be called after APIC_ID is
    changed.
    
    In fact, this fixes another small issue in the code in that
    potential changes to a vCPU's xAPIC ID need not be tracked for
    KVM_GET_LAPIC.
    
    Fixes: 3743c2f0 ("KVM: x86: inhibit APICv/AVIC on changes to APIC ID or APIC base")
    Signed-off-by: default avatarYuan ZhaoXiong <yuanzhaoxiong@baidu.com>
    Message-Id: <1669984574-32692-1-git-send-email-yuanzhaoxiong@baidu.com>
    Cc: stable@vger.kernel.org
    Reported-by: default avatarAlejandro Jimenez <alejandro.j.jimenez@oracle.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    ef407577
lapic.c 78.7 KB