From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gleb Natapov Subject: Re: [PATCH] KVM: x86: should release vcpu when closing vcpu fd Date: Thu, 29 Aug 2013 06:20:08 +0300 Message-ID: <20130829032007.GC4811@redhat.com> References: <1377677290-2851-1-git-send-email-chen.fan.fnst@cn.fujitsu.com> <20130828082120.GA24759@redhat.com> <1377745607.32495.19.camel@G08FNSTD131468> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: kvm@vger.kernel.org To: chenfan Return-path: Received: from mx1.redhat.com ([209.132.183.28]:51566 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753071Ab3H2DUR convert rfc822-to-8bit (ORCPT ); Wed, 28 Aug 2013 23:20:17 -0400 Content-Disposition: inline In-Reply-To: <1377745607.32495.19.camel@G08FNSTD131468> Sender: kvm-owner@vger.kernel.org List-ID: On Thu, Aug 29, 2013 at 11:06:47AM +0800, chenfan wrote: > On Wed, 2013-08-28 at 11:21 +0300, Gleb Natapov wrote: > > On Wed, Aug 28, 2013 at 04:08:10PM +0800, Chen Fan wrote: > > > If we want to remove a vcpu from vm, we should not be only to > > > put kvm, we need to decrease online vcpus and free struct kvm_vcp= u > > > when closing a vcpu file descriptor. > > >=20 > > It much more complicated that what you do here. kvm->vcpus[] is acc= essed > > without locking and kvm->online_vcpus is assumed to be greater than= max > > occupied index in kvm->vcpus[]. Attempt where made to make it possi= ble > > to destroy individual vcpus separately from destroying VM before, b= ut > > they were unsuccessful thus far. > >=20 > Oh, the motivation of this patch is for QEMU for implementing cpu > hot-remove, I want to remove the vcpu from KVM after QEMU closing the > kvm_fd. there I need some advice for this feature. if this patch is n= ot > comprehensive enough=EF=BC=8CI want to know the reasons for a more de= tailed. > Could you tell me? >=20 I told you above. > Thanks, > Chen >=20 > > > Signed-off-by: Chen Fan > > > --- > > > arch/x86/kvm/x86.c | 14 ++++++++++++++ > > > include/linux/kvm_host.h | 1 + > > > virt/kvm/kvm_main.c | 4 +++- > > > 3 files changed, 18 insertions(+), 1 deletion(-) > > >=20 > > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > > > index d21bce5..3370de1 100644 > > > --- a/arch/x86/kvm/x86.c > > > +++ b/arch/x86/kvm/x86.c > > > @@ -6904,6 +6904,20 @@ static void kvm_free_vcpus(struct kvm *kvm= ) > > > mutex_unlock(&kvm->lock); > > > } > > > =20 > > > +void kvm_arch_vcpu_release(struct kvm_vcpu *vcpu) > > > +{ > > > + struct kvm *kvm =3D vcpu->kvm; > > > + > > > + mutex_lock(&kvm->lock); > > > + atomic_dec(&kvm->online_vcpus); > > > + kvm->vcpus[atomic_read(&kvm->online_vcpus)] =3D NULL; > > > + mutex_unlock(&kvm->lock); > > > + > > > + kvm_clear_async_pf_completion_queue(vcpu); > > > + kvm_unload_vcpu_mmu(vcpu); > > > + kvm_arch_vcpu_free(vcpu); > > > +} > > > + > > > void kvm_arch_sync_events(struct kvm *kvm) > > > { > > > kvm_free_all_assigned_devices(kvm); > > > diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h > > > index a63d83e..e0811f97 100644 > > > --- a/include/linux/kvm_host.h > > > +++ b/include/linux/kvm_host.h > > > @@ -631,6 +631,7 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct = kvm *kvm, unsigned int id); > > > int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu); > > > int kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu); > > > void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu); > > > +void kvm_arch_vcpu_release(struct kvm_vcpu *vcpu); > > > =20 > > > int kvm_arch_hardware_enable(void *garbage); > > > void kvm_arch_hardware_disable(void *garbage); > > > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c > > > index 1580dd4..442014b 100644 > > > --- a/virt/kvm/kvm_main.c > > > +++ b/virt/kvm/kvm_main.c > > > @@ -1873,8 +1873,10 @@ static int kvm_vcpu_mmap(struct file *file= , struct vm_area_struct *vma) > > > static int kvm_vcpu_release(struct inode *inode, struct file *fi= lp) > > > { > > > struct kvm_vcpu *vcpu =3D filp->private_data; > > > + struct kvm *kvm =3D vcpu->kvm; > > > =20 > > > - kvm_put_kvm(vcpu->kvm); > > > + kvm_arch_vcpu_release(vcpu); > > > + kvm_put_kvm(kvm); > > > return 0; > > > } > > > =20 > > > --=20 > > > 1.8.1.4 > > >=20 > > > -- > > > To unsubscribe from this list: send the line "unsubscribe kvm" in > > > the body of a message to majordomo@vger.kernel.org > > > More majordomo info at http://vger.kernel.org/majordomo-info.htm= l > >=20 > > -- > > Gleb. > > -- > > To unsubscribe from this list: send the line "unsubscribe kvm" in > > the body of a message to majordomo@vger.kernel.org > > More majordomo info at http://vger.kernel.org/majordomo-info.html >=20 -- Gleb.