On Wed, Nov 22, 2023 at 06:15:44AM +0000, Li,Rongqing wrote: > > > > -----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? Yes. > > 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); Better keep the same style as in kvm_arch_vcpu_create(): if (!lapic_in_kernel(vcpu)) static_branch_dec(&kvm_has_noapic_vcpu); else kvm_free_lapic(vcpu); Thanks, Yilun > + > 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) > > >