> -----Original Message----- > From: Xu Yilun <yilun.xu@xxxxxxxxxxxxxxx> > Sent: Tuesday, November 21, 2023 11:14 PM > To: Li,Rongqing <lirongqing@xxxxxxxxx> > Cc: x86@xxxxxxxxxx; kvm@xxxxxxxxxxxxxxx > Subject: Re: [PATCH] KVM: x86: fix kvm_has_noapic_vcpu updates when fail to > create vcpu > > On Fri, Nov 17, 2023 at 08:26:33PM +0800, Li RongQing wrote: > > Static key kvm_has_noapic_vcpu should be reduced when fail to create > > vcpu, this patch fixes it > > > > Signed-off-by: Li RongQing <lirongqing@xxxxxxxxx> > > --- > > arch/x86/kvm/x86.c | 5 ++++- > > 1 file changed, 4 insertions(+), 1 deletion(-) > > > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index > > 41cce50..2a22e66 100644 > > --- a/arch/x86/kvm/x86.c > > +++ b/arch/x86/kvm/x86.c > > @@ -11957,7 +11957,10 @@ int kvm_arch_vcpu_create(struct kvm_vcpu > *vcpu) > > kfree(vcpu->arch.mci_ctl2_banks); > > free_page((unsigned long)vcpu->arch.pio_data); > > fail_free_lapic: > > - kvm_free_lapic(vcpu); > > + if (!lapic_in_kernel(vcpu)) > > + static_branch_dec(&kvm_has_noapic_vcpu); > > + else > > + kvm_free_lapic(vcpu); > > fail_mmu_destroy: > > kvm_mmu_destroy(vcpu); > > return r; > > It is good to me. But is it better also take the chance to tidy up > kvm_arch_vcpu_destroy(): > > kvm_free_lapic(vcpu); > idx = srcu_read_lock(&vcpu->kvm->srcu); > kvm_mmu_destroy(vcpu); > srcu_read_unlock(&vcpu->kvm->srcu, idx); > free_page((unsigned long)vcpu->arch.pio_data); > kvfree(vcpu->arch.cpuid_entries); > if (!lapic_in_kernel(vcpu)) > static_branch_dec(&kvm_has_noapic_vcpu); > Do you means that calling kvm_free_lapic when lapic_in_kernel is true? diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 2c92407..9d176c7 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -12122,14 +12122,17 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) kvm_pmu_destroy(vcpu); kfree(vcpu->arch.mce_banks); kfree(vcpu->arch.mci_ctl2_banks); - kvm_free_lapic(vcpu); + + if (lapic_in_kernel(vcpu)) + kvm_free_lapic(vcpu); + else + static_branch_dec(&kvm_has_noapic_vcpu); + idx = srcu_read_lock(&vcpu->kvm->srcu); kvm_mmu_destroy(vcpu); srcu_read_unlock(&vcpu->kvm->srcu, idx); free_page((unsigned long)vcpu->arch.pio_data); kvfree(vcpu->arch.cpuid_entries); - if (!lapic_in_kernel(vcpu)) - static_branch_dec(&kvm_has_noapic_vcpu); } void kvm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)