From nobody Tue May 7 03:35:13 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1524573040009895.411540656798; Tue, 24 Apr 2018 05:30:40 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1360A4ACA4; Tue, 24 Apr 2018 12:30:38 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 01FC06A951; Tue, 24 Apr 2018 12:30:37 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 8FCAAB3486; Tue, 24 Apr 2018 12:30:35 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w3OCSHVg014656 for ; Tue, 24 Apr 2018 08:28:17 -0400 Received: by smtp.corp.redhat.com (Postfix) id 089737A4CF; Tue, 24 Apr 2018 12:28:17 +0000 (UTC) Received: from unknown54ee7586bd10.attlocal.net.com (ovpn-116-64.phx2.redhat.com [10.3.116.64]) by smtp.corp.redhat.com (Postfix) with ESMTP id B9EFB6CA28 for ; Tue, 24 Apr 2018 12:28:16 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Tue, 24 Apr 2018 08:28:04 -0400 Message-Id: <20180424122809.12534-2-jferlan@redhat.com> In-Reply-To: <20180424122809.12534-1-jferlan@redhat.com> References: <20180424122809.12534-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 1/6] conf: Split FindBy{UUID|Name} into locked helpers X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 24 Apr 2018 12:30:38 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Create helpers virDomainObjListFindByUUIDLocked and virDomainObjListFindByNameLocked to avoid the need to lock the domain object list leaving that task for the caller. Signed-off-by: John Ferlan Reviewed-by: Erik Skultety --- src/conf/virdomainobjlist.c | 58 ++++++++++++++++++++++++++++++++++++++---= ---- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/src/conf/virdomainobjlist.c b/src/conf/virdomainobjlist.c index d57ed10a5f..9aa2abd8c3 100644 --- a/src/conf/virdomainobjlist.c +++ b/src/conf/virdomainobjlist.c @@ -133,19 +133,16 @@ virDomainObjListFindByID(virDomainObjListPtr doms, } =20 =20 -virDomainObjPtr -virDomainObjListFindByUUID(virDomainObjListPtr doms, - const unsigned char *uuid) +static virDomainObjPtr +virDomainObjListFindByUUIDLocked(virDomainObjListPtr doms, + const unsigned char *uuid) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virDomainObjPtr obj; =20 - virObjectRWLockRead(doms); virUUIDFormat(uuid, uuidstr); - obj =3D virHashLookup(doms->objs, uuidstr); virObjectRef(obj); - virObjectRWUnlock(doms); if (obj) { virObjectLock(obj); if (obj->removing) { @@ -158,15 +155,36 @@ virDomainObjListFindByUUID(virDomainObjListPtr doms, } =20 =20 -virDomainObjPtr virDomainObjListFindByName(virDomainObjListPtr doms, - const char *name) +/** + * @doms: Locked domain object list + * @uuid: UUID to search the doms->objs table + * + * Lookup the @uuid in the doms->objs hash table and return a + * locked and ref counted domain object if found. Caller is + * expected to use the virDomainObjEndAPI when done with the object. + */ +virDomainObjPtr +virDomainObjListFindByUUID(virDomainObjListPtr doms, + const unsigned char *uuid) { virDomainObjPtr obj; =20 virObjectRWLockRead(doms); + obj =3D virDomainObjListFindByUUIDLocked(doms, uuid); + virObjectRWUnlock(doms); + + return obj; +} + + +static virDomainObjPtr +virDomainObjListFindByNameLocked(virDomainObjListPtr doms, + const char *name) +{ + virDomainObjPtr obj; + obj =3D virHashLookup(doms->objsName, name); virObjectRef(obj); - virObjectRWUnlock(doms); if (obj) { virObjectLock(obj); if (obj->removing) { @@ -180,6 +198,28 @@ virDomainObjPtr virDomainObjListFindByName(virDomainOb= jListPtr doms, =20 =20 /** + * @doms: Locked domain object list + * @name: Name to search the doms->objsName table + * + * Lookup the @name in the doms->objsName hash table and return a + * locked and ref counted domain object if found. Caller is expected + * to use the virDomainObjEndAPI when done with the object. + */ +virDomainObjPtr +virDomainObjListFindByName(virDomainObjListPtr doms, + const char *name) +{ + virDomainObjPtr obj; + + virObjectRWLockRead(doms); + obj =3D virDomainObjListFindByNameLocked(doms, name); + virObjectRWUnlock(doms); + + return obj; +} + + +/** * @doms: Domain object list pointer * @vm: Domain object to be added * --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Tue May 7 03:35:13 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1524573106617979.5506096225699; Tue, 24 Apr 2018 05:31:46 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C54BA3004413; Tue, 24 Apr 2018 12:31:44 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 3512581CD4; Tue, 24 Apr 2018 12:31:44 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id EED1AB3487; Tue, 24 Apr 2018 12:31:42 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w3OCSH0A014664 for ; Tue, 24 Apr 2018 08:28:17 -0400 Received: by smtp.corp.redhat.com (Postfix) id BF66E7AC8A; Tue, 24 Apr 2018 12:28:17 +0000 (UTC) Received: from unknown54ee7586bd10.attlocal.net.com (ovpn-116-64.phx2.redhat.com [10.3.116.64]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7B7A27AC85 for ; Tue, 24 Apr 2018 12:28:17 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Tue, 24 Apr 2018 08:28:05 -0400 Message-Id: <20180424122809.12534-3-jferlan@redhat.com> In-Reply-To: <20180424122809.12534-1-jferlan@redhat.com> References: <20180424122809.12534-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 2/6] conf: Use virDomainObjListFindBy*Locked for virDomainObjListAdd X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.44]); Tue, 24 Apr 2018 12:31:45 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Use the FindBy{UUID|Name}Locked helpers which will return a locked and ref counted object rather than the direct virHashLookup and virObjectLock of the returned object. We'll need to temporarily virObjectUnref when we assign a new domain @def, but that will change shortly when virDomainObjListAddObjLocked returns the correct reference counted object. Use the virDomainObjEndAPI in the error path to Unref/Unlock for the corresponding Unref/Unlock of either the FindBy* return or the virDomainObjNew since both return a reffed/locked object. Signed-off-by: John Ferlan Reviewed-by: Erik Skultety --- src/conf/virdomainobjlist.c | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/conf/virdomainobjlist.c b/src/conf/virdomainobjlist.c index 9aa2abd8c3..6752f6c572 100644 --- a/src/conf/virdomainobjlist.c +++ b/src/conf/virdomainobjlist.c @@ -280,11 +280,8 @@ virDomainObjListAddLocked(virDomainObjListPtr doms, if (oldDef) *oldDef =3D NULL; =20 - virUUIDFormat(def->uuid, uuidstr); - /* See if a VM with matching UUID already exists */ - if ((vm =3D virHashLookup(doms->objs, uuidstr))) { - virObjectLock(vm); + if ((vm =3D virDomainObjListFindByUUIDLocked(doms, def->uuid))) { /* UUID matches, but if names don't match, refuse it */ if (STRNEQ(vm->def->name, def->name)) { virUUIDFormat(vm->def->uuid, uuidstr); @@ -314,10 +311,12 @@ virDomainObjListAddLocked(virDomainObjListPtr doms, def, !!(flags & VIR_DOMAIN_OBJ_LIST_ADD_LIVE), oldDef); + /* XXX: Temporary until this API is fixed to return a locked and + * refcnt'd object */ + virObjectUnref(vm); } else { /* UUID does not match, but if a name matches, refuse it */ - if ((vm =3D virHashLookup(doms->objsName, def->name))) { - virObjectLock(vm); + if ((vm =3D virDomainObjListFindByNameLocked(doms, def->name))) { virUUIDFormat(vm->def->uuid, uuidstr); virReportError(VIR_ERR_OPERATION_FAILED, _("domain '%s' already exists with uuid %s"), @@ -329,18 +328,15 @@ virDomainObjListAddLocked(virDomainObjListPtr doms, goto cleanup; vm->def =3D def; =20 - if (virDomainObjListAddObjLocked(doms, vm) < 0) { - virDomainObjEndAPI(&vm); - return NULL; - } + if (virDomainObjListAddObjLocked(doms, vm) < 0) + goto error; } cleanup: return vm; =20 error: - virObjectUnlock(vm); - vm =3D NULL; - goto cleanup; + virDomainObjEndAPI(&vm); + return NULL; } =20 =20 --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Tue May 7 03:35:13 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1524573119146507.42870846783273; Tue, 24 Apr 2018 05:31:59 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6EEEE3134BB1; Tue, 24 Apr 2018 12:31:56 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 10FCD82F7F; Tue, 24 Apr 2018 12:31:56 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id F22331805971; Tue, 24 Apr 2018 12:31:54 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w3OCSIV8014669 for ; Tue, 24 Apr 2018 08:28:18 -0400 Received: by smtp.corp.redhat.com (Postfix) id 34AA061F22; Tue, 24 Apr 2018 12:28:18 +0000 (UTC) Received: from unknown54ee7586bd10.attlocal.net.com (ovpn-116-64.phx2.redhat.com [10.3.116.64]) by smtp.corp.redhat.com (Postfix) with ESMTP id E798B61559 for ; Tue, 24 Apr 2018 12:28:17 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Tue, 24 Apr 2018 08:28:06 -0400 Message-Id: <20180424122809.12534-4-jferlan@redhat.com> In-Reply-To: <20180424122809.12534-1-jferlan@redhat.com> References: <20180424122809.12534-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 3/6] conf: Move and use virDomainObjListRemoveLocked X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.45]); Tue, 24 Apr 2018 12:31:58 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Rather than open code within virDomainObjListRemove, just call the *Locked function. Additionally, add comments to virDomainObjListRemove to describe the usage model. Signed-off-by: John Ferlan Reviewed-by: Erik Skultety --- src/conf/virdomainobjlist.c | 64 +++++++++++++++++++++++++----------------= ---- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/src/conf/virdomainobjlist.c b/src/conf/virdomainobjlist.c index 6752f6c572..5725040552 100644 --- a/src/conf/virdomainobjlist.c +++ b/src/conf/virdomainobjlist.c @@ -355,26 +355,50 @@ virDomainObjPtr virDomainObjListAdd(virDomainObjListP= tr doms, } =20 =20 -/* - * The caller must hold a lock on the driver owning 'doms', - * and must also have locked 'dom', to ensure no one else - * is either waiting for 'dom' or still using it +/* The caller must hold lock on 'doms' in addition to 'virDomainObjListRem= ove' + * requirements + * + * Can be used to remove current element while iterating with + * virDomainObjListForEach */ -void virDomainObjListRemove(virDomainObjListPtr doms, - virDomainObjPtr dom) +void +virDomainObjListRemoveLocked(virDomainObjListPtr doms, + virDomainObjPtr dom) { char uuidstr[VIR_UUID_STRING_BUFLEN]; =20 - dom->removing =3D true; virUUIDFormat(dom->def->uuid, uuidstr); - virObjectRef(dom); - virObjectUnlock(dom); =20 - virObjectRWLockWrite(doms); - virObjectLock(dom); virHashRemoveEntry(doms->objs, uuidstr); virHashRemoveEntry(doms->objsName, dom->def->name); virObjectUnlock(dom); +} + + +/** + * @doms: Pointer to the domain object list + * @dom: Domain pointer from either after Add or FindBy* API where the + * @dom was successfully added to both the doms->objs and ->objsName + * hash tables that now would need to be removed. + * + * The caller must hold a lock on the driver owning 'doms', + * and must also have locked and ref counted 'dom', to ensure + * no one else is either waiting for 'dom' or still using it. + * + * When this function returns, @dom will be removed from the hash + * tables, unlocked, and returned with the refcnt that was present + * upon entry. + */ +void +virDomainObjListRemove(virDomainObjListPtr doms, + virDomainObjPtr dom) +{ + dom->removing =3D true; + virObjectRef(dom); + virObjectUnlock(dom); + virObjectRWLockWrite(doms); + virObjectLock(dom); + virDomainObjListRemoveLocked(doms, dom); virObjectUnref(dom); virObjectRWUnlock(doms); } @@ -446,24 +470,6 @@ virDomainObjListRename(virDomainObjListPtr doms, return ret; } =20 -/* The caller must hold lock on 'doms' in addition to 'virDomainObjListRem= ove' - * requirements - * - * Can be used to remove current element while iterating with - * virDomainObjListForEach - */ -void virDomainObjListRemoveLocked(virDomainObjListPtr doms, - virDomainObjPtr dom) -{ - char uuidstr[VIR_UUID_STRING_BUFLEN]; - - virUUIDFormat(dom->def->uuid, uuidstr); - - virHashRemoveEntry(doms->objs, uuidstr); - virHashRemoveEntry(doms->objsName, dom->def->name); - virObjectUnlock(dom); -} - =20 static virDomainObjPtr virDomainObjListLoadConfig(virDomainObjListPtr doms, --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Tue May 7 03:35:13 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 152457305663667.5214124087563; Tue, 24 Apr 2018 05:30:56 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id EADBF315008E; Tue, 24 Apr 2018 12:30:53 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id A6E275EE02; Tue, 24 Apr 2018 12:30:53 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 2165F180596E; Tue, 24 Apr 2018 12:30:53 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w3OCSI3K014676 for ; Tue, 24 Apr 2018 08:28:18 -0400 Received: by smtp.corp.redhat.com (Postfix) id 9F6AD61559; Tue, 24 Apr 2018 12:28:18 +0000 (UTC) Received: from unknown54ee7586bd10.attlocal.net.com (ovpn-116-64.phx2.redhat.com [10.3.116.64]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5D33961F22 for ; Tue, 24 Apr 2018 12:28:18 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Tue, 24 Apr 2018 08:28:07 -0400 Message-Id: <20180424122809.12534-5-jferlan@redhat.com> In-Reply-To: <20180424122809.12534-1-jferlan@redhat.com> References: <20180424122809.12534-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 4/6] libxl: Add refcnt for args->vm during migration X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.41]); Tue, 24 Apr 2018 12:30:55 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" When adding the @vm to the @args for usage during a thread or callback, let's add the reference to it at the time of adding to ensure nothing else deletes it. The corresponding Unref is then added to the Dispose function. Signed-off-by: John Ferlan Reviewed-by: Marc Hartmayer --- src/libxl/libxl_migration.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/libxl/libxl_migration.c b/src/libxl/libxl_migration.c index d7b494b392..7fe352306c 100644 --- a/src/libxl/libxl_migration.c +++ b/src/libxl/libxl_migration.c @@ -239,6 +239,7 @@ libxlMigrationDstArgsDispose(void *obj) =20 libxlMigrationCookieFree(args->migcookie); VIR_FREE(args->socks); + virObjectUnref(args->vm); } =20 static int @@ -608,7 +609,7 @@ libxlDomainMigrationDstPrepareTunnel3(virConnectPtr dco= nn, goto error; =20 args->conn =3D dconn; - args->vm =3D vm; + args->vm =3D virObjectRef(vm); args->flags =3D flags; args->migcookie =3D mig; /* Receive from pipeOut */ @@ -763,7 +764,7 @@ libxlDomainMigrationDstPrepare(virConnectPtr dconn, goto error; =20 args->conn =3D dconn; - args->vm =3D vm; + args->vm =3D virObjectRef(vm); args->flags =3D flags; args->socks =3D socks; args->nsocks =3D nsocks; --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Tue May 7 03:35:13 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1524573070201518.6035164071079; Tue, 24 Apr 2018 05:31:10 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5597580F9E; Tue, 24 Apr 2018 12:31:08 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id ABADE6A051; Tue, 24 Apr 2018 12:31:07 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id E18F8B348D; Tue, 24 Apr 2018 12:31:06 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w3OCSJ1b014684 for ; Tue, 24 Apr 2018 08:28:19 -0400 Received: by smtp.corp.redhat.com (Postfix) id 80F745D781; Tue, 24 Apr 2018 12:28:19 +0000 (UTC) Received: from unknown54ee7586bd10.attlocal.net.com (ovpn-116-64.phx2.redhat.com [10.3.116.64]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4046A61559 for ; Tue, 24 Apr 2018 12:28:18 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Tue, 24 Apr 2018 08:28:08 -0400 Message-Id: <20180424122809.12534-6-jferlan@redhat.com> In-Reply-To: <20180424122809.12534-1-jferlan@redhat.com> References: <20180424122809.12534-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 5/6] libxl: Add refcnt for args->conn during migration X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 24 Apr 2018 12:31:09 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Since the @dconn reference via args->conn will be used via a thread or callback, let's make sure memory associated with it isn't free'd unexpectedly before we use it. The Unref will be done when the object is Dispose'd. Signed-off-by: John Ferlan Reviewed-by: Erik Skultety Reviewed-by: Marc Hartmayer --- src/libxl/libxl_migration.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/libxl/libxl_migration.c b/src/libxl/libxl_migration.c index 7fe352306c..d37a4a687a 100644 --- a/src/libxl/libxl_migration.c +++ b/src/libxl/libxl_migration.c @@ -239,6 +239,7 @@ libxlMigrationDstArgsDispose(void *obj) =20 libxlMigrationCookieFree(args->migcookie); VIR_FREE(args->socks); + virObjectUnref(args->conn); virObjectUnref(args->vm); } =20 @@ -608,7 +609,7 @@ libxlDomainMigrationDstPrepareTunnel3(virConnectPtr dco= nn, if (!(args =3D virObjectNew(libxlMigrationDstArgsClass))) goto error; =20 - args->conn =3D dconn; + args->conn =3D virObjectRef(dconn); args->vm =3D virObjectRef(vm); args->flags =3D flags; args->migcookie =3D mig; @@ -763,7 +764,7 @@ libxlDomainMigrationDstPrepare(virConnectPtr dconn, if (!(args =3D virObjectNew(libxlMigrationDstArgsClass))) goto error; =20 - args->conn =3D dconn; + args->conn =3D virObjectRef(dconn); args->vm =3D virObjectRef(vm); args->flags =3D flags; args->socks =3D socks; --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Tue May 7 03:35:13 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1524573129435913.6322541116114; Tue, 24 Apr 2018 05:32:09 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B9042356DA; Tue, 24 Apr 2018 12:32:07 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 4F6A382F6A; Tue, 24 Apr 2018 12:32:07 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 73662180BAD3; Tue, 24 Apr 2018 12:32:06 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w3OCSLGk014694 for ; Tue, 24 Apr 2018 08:28:21 -0400 Received: by smtp.corp.redhat.com (Postfix) id 6442D6CA28; Tue, 24 Apr 2018 12:28:21 +0000 (UTC) Received: from unknown54ee7586bd10.attlocal.net.com (ovpn-116-64.phx2.redhat.com [10.3.116.64]) by smtp.corp.redhat.com (Postfix) with ESMTP id EDB9061F37 for ; Tue, 24 Apr 2018 12:28:19 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Tue, 24 Apr 2018 08:28:09 -0400 Message-Id: <20180424122809.12534-7-jferlan@redhat.com> In-Reply-To: <20180424122809.12534-1-jferlan@redhat.com> References: <20180424122809.12534-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 6/6] conf: Clean up object referencing for Add and Remove X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 24 Apr 2018 12:32:08 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" When adding a new object to the domain object list, there should have been 2 virObjectRef calls made one for each list into which the object was placed to match the 2 virObjectUnref calls that would occur during Remove as part of virHashRemoveEntry when virObjectFreeHashData is called when the element is removed from the hash table as set up in virDomainObjListNew. Some drivers (libxl, lxc, qemu, and vz) handled this inconsistency by calling virObjectRef upon successful return from virDomainObjListAdd in order to use virDomainObjEndAPI when done with the returned @vm. While others (bhyve, openvz, test, and vmware) handled this via only calling virObjectUnlock upon successful return from virDomainObjListAdd. This patch will "unify" the approach to use virDomainObjEndAPI for any @vm successfully returned from virDomainObjListAdd. Because list removal is so tightly coupled with list addition, this patch fixes the list removal algorithm to return the object as entered - "locked and reffed". This way, the callers can then decide how to uniformly handle add/remove success and failure. This removes the onus on the caller to "specially handle" the @vm during removal processing. The Add/Remove logic allows for some logic simplification such as in libxl where we can Remove the @vm directly rather than needing to set a @remove_dom boolean and removing after the libxlDomainObjEndJob completes as the @vm is locked/reffed. Signed-off-by: John Ferlan Reviewed-by: Erik Skultety --- src/bhyve/bhyve_driver.c | 21 +++++---------- src/conf/virdomainobjlist.c | 33 +++++++++++------------ src/libxl/libxl_driver.c | 64 +++++++++--------------------------------= ---- src/libxl/libxl_migration.c | 31 +++++----------------- src/lxc/lxc_driver.c | 21 ++++----------- src/lxc/lxc_process.c | 17 ++++++------ src/openvz/openvz_conf.c | 2 +- src/openvz/openvz_driver.c | 20 +++++--------- src/qemu/qemu_domain.c | 17 +----------- src/qemu/qemu_driver.c | 6 +---- src/qemu/qemu_migration.c | 3 +-- src/test/test_driver.c | 56 ++++++++++++--------------------------- src/uml/uml_driver.c | 37 +++++++------------------- src/vmware/vmware_conf.c | 3 +-- src/vmware/vmware_driver.c | 17 ++++-------- src/vz/vz_driver.c | 1 - src/vz/vz_sdk.c | 3 --- 17 files changed, 99 insertions(+), 253 deletions(-) diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index 768578a43f..6001f0806c 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -550,7 +550,6 @@ bhyveDomainDefineXMLFlags(virConnectPtr conn, const cha= r *xml, unsigned int flag if (virDomainSaveConfig(BHYVE_CONFIG_DIR, caps, vm->newDef ? vm->newDef : vm->def) < 0) { virDomainObjListRemove(privconn->domains, vm); - vm =3D NULL; goto cleanup; } =20 @@ -566,8 +565,7 @@ bhyveDomainDefineXMLFlags(virConnectPtr conn, const cha= r *xml, unsigned int flag virObjectUnref(caps); virDomainDefFree(def); virDomainDefFree(oldDef); - if (vm) - virObjectUnlock(vm); + virDomainObjEndAPI(&vm); if (event) virObjectEventStateQueue(privconn->domainEventState, event); =20 @@ -609,12 +607,10 @@ bhyveDomainUndefine(virDomainPtr domain) VIR_DOMAIN_EVENT_UNDEFINED, VIR_DOMAIN_EVENT_UNDEFINED_R= EMOVED); =20 - if (virDomainObjIsActive(vm)) { + if (virDomainObjIsActive(vm)) vm->persistent =3D 0; - } else { + else virDomainObjListRemove(privconn->domains, vm); - virObjectLock(vm); - } =20 ret =3D 0; =20 @@ -958,10 +954,8 @@ bhyveDomainCreateXML(virConnectPtr conn, VIR_DOMAIN_RUNNING_BOOTED, start_flags) < 0) { /* If domain is not persistent, remove its data */ - if (!vm->persistent) { + if (!vm->persistent) virDomainObjListRemove(privconn->domains, vm); - vm =3D NULL; - } goto cleanup; } =20 @@ -974,8 +968,7 @@ bhyveDomainCreateXML(virConnectPtr conn, cleanup: virObjectUnref(caps); virDomainDefFree(def); - if (vm) - virObjectUnlock(vm); + virDomainObjEndAPI(&vm); if (event) virObjectEventStateQueue(privconn->domainEventState, event); =20 @@ -1007,10 +1000,8 @@ bhyveDomainDestroy(virDomainPtr dom) VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_DES= TROYED); =20 - if (!vm->persistent) { + if (!vm->persistent) virDomainObjListRemove(privconn->domains, vm); - virObjectLock(vm); - } =20 cleanup: virDomainObjEndAPI(&vm); diff --git a/src/conf/virdomainobjlist.c b/src/conf/virdomainobjlist.c index 5725040552..a30b3908f0 100644 --- a/src/conf/virdomainobjlist.c +++ b/src/conf/virdomainobjlist.c @@ -226,9 +226,13 @@ virDomainObjListFindByName(virDomainObjListPtr doms, * Upon entry @vm should have at least 1 ref and be locked. * * Add the @vm into the @doms->objs and @doms->objsName hash - * tables. + * tables. Once successfully added into a table, increase the + * reference count since upon removal in virHashRemoveEntry + * the virObjectUnref will be called since the hash tables were + * configured to call virObjectFreeHashData when the object is + * removed from the hash table. * - * Returns 0 on success with 2 references and locked + * Returns 0 on success with 3 references and locked * -1 on failure with 1 reference and locked */ static int @@ -240,15 +244,12 @@ virDomainObjListAddObjLocked(virDomainObjListPtr doms, virUUIDFormat(vm->def->uuid, uuidstr); if (virHashAddEntry(doms->objs, uuidstr, vm) < 0) return -1; + virObjectRef(vm); =20 if (virHashAddEntry(doms->objsName, vm->def->name, vm) < 0) { - virObjectRef(vm); virHashRemoveEntry(doms->objs, uuidstr); return -1; } - - /* Since domain is in two hash tables, increment the - * reference counter */ virObjectRef(vm); =20 return 0; @@ -266,6 +267,9 @@ virDomainObjListAddObjLocked(virDomainObjListPtr doms, * the @def being added is assumed to represent a * live config, not a future inactive config * + * The returned @vm from this function will be locked and ref + * counted. The caller is expected to use virDomainObjEndAPI + * when it completes usage. */ static virDomainObjPtr virDomainObjListAddLocked(virDomainObjListPtr doms, @@ -311,9 +315,6 @@ virDomainObjListAddLocked(virDomainObjListPtr doms, def, !!(flags & VIR_DOMAIN_OBJ_LIST_ADD_LIVE), oldDef); - /* XXX: Temporary until this API is fixed to return a locked and - * refcnt'd object */ - virObjectUnref(vm); } else { /* UUID does not match, but if a name matches, refuse it */ if ((vm =3D virDomainObjListFindByNameLocked(doms, def->name))) { @@ -371,7 +372,6 @@ virDomainObjListRemoveLocked(virDomainObjListPtr doms, =20 virHashRemoveEntry(doms->objs, uuidstr); virHashRemoveEntry(doms->objsName, dom->def->name); - virObjectUnlock(dom); } =20 =20 @@ -386,8 +386,7 @@ virDomainObjListRemoveLocked(virDomainObjListPtr doms, * no one else is either waiting for 'dom' or still using it. * * When this function returns, @dom will be removed from the hash - * tables, unlocked, and returned with the refcnt that was present - * upon entry. + * tables and returned with lock and refcnt that was present upon entry. */ void virDomainObjListRemove(virDomainObjListPtr doms, @@ -453,9 +452,11 @@ virDomainObjListRename(virDomainObjListPtr doms, if (virHashAddEntry(doms->objsName, new_name, dom) < 0) goto cleanup; =20 - /* Okay, this is crazy. virHashAddEntry() does not increment - * the refcounter of @dom, but virHashRemoveEntry() does - * decrement it. We need to work around it. */ + /* Increment the refcnt for @new_name. We're about to remove + * the @old_name which will cause the refcnt to be decremented + * via the virObjectUnref call made during the virObjectFreeHashData + * as a result of removing something from the object list hash + * table as set up during virDomainObjListNew. */ virObjectRef(dom); =20 rc =3D callback(dom, new_name, flags, opaque); @@ -624,7 +625,7 @@ virDomainObjListLoadAllConfigs(virDomainObjListPtr doms, if (dom) { if (!liveStatus) dom->persistent =3D 1; - virObjectUnlock(dom); + virDomainObjEndAPI(&dom); } else { VIR_ERROR(_("Failed to load config for domain '%s'"), entry->d= _name); } diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 55a93a489b..34adef8d48 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -450,13 +450,8 @@ libxlReconnectDomain(virDomainObjPtr vm, =20 error: libxlDomainCleanup(driver, vm); - if (!vm->persistent) { + if (!vm->persistent) virDomainObjListRemoveLocked(driver->domains, vm); - - /* virDomainObjListRemoveLocked leaves the object unlocked, - * lock it again to factorize more code. */ - virObjectLock(vm); - } goto cleanup; } =20 @@ -605,7 +600,6 @@ libxlAddDom0(libxlDriverPrivatePtr driver) 0, &oldDef))) goto cleanup; - def =3D NULL; =20 vm->persistent =3D 1; @@ -626,8 +620,7 @@ libxlAddDom0(libxlDriverPrivatePtr driver) libxl_dominfo_dispose(&d_info); virDomainDefFree(def); virDomainDefFree(oldDef); - if (vm) - virObjectUnlock(vm); + virDomainObjEndAPI(&vm); virObjectUnref(cfg); return ret; } @@ -1043,23 +1036,18 @@ libxlDomainCreateXML(virConnectPtr conn, const char= *xml, VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, NULL))) goto cleanup; - virObjectRef(vm); def =3D NULL; =20 if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0) { - if (!vm->persistent) { + if (!vm->persistent) virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); - } goto cleanup; } =20 if (libxlDomainStartNew(driver, vm, (flags & VIR_DOMAIN_START_PAUSED) !=3D 0) < 0) { - if (!vm->persistent) { + if (!vm->persistent) virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); - } goto endjob; } =20 @@ -1396,10 +1384,8 @@ libxlDomainDestroyFlags(virDomainPtr dom, VIR_DOMAIN_EVENT_STOPPED_DESTROYED); =20 libxlDomainCleanup(driver, vm); - if (!vm->persistent) { + if (!vm->persistent) virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); - } =20 ret =3D 0; =20 @@ -1759,7 +1745,6 @@ libxlDomainSaveFlags(virDomainPtr dom, const char *to= , const char *dxml, libxlDriverPrivatePtr driver =3D dom->conn->privateData; virDomainObjPtr vm; int ret =3D -1; - bool remove_dom =3D false; =20 #ifdef LIBXL_HAVE_NO_SUSPEND_RESUME virReportUnsupportedError(); @@ -1791,7 +1776,7 @@ libxlDomainSaveFlags(virDomainPtr dom, const char *to= , const char *dxml, goto endjob; =20 if (!vm->persistent) - remove_dom =3D true; + virDomainObjListRemove(driver->domains, vm); =20 ret =3D 0; =20 @@ -1799,10 +1784,6 @@ libxlDomainSaveFlags(virDomainPtr dom, const char *t= o, const char *dxml, libxlDomainObjEndJob(driver, vm); =20 cleanup: - if (remove_dom && vm) { - virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); - } virDomainObjEndAPI(&vm); return ret; } @@ -1850,24 +1831,19 @@ libxlDomainRestoreFlags(virConnectPtr conn, const c= har *from, VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, NULL))) goto cleanup; - virObjectRef(vm); def =3D NULL; =20 if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0) { - if (!vm->persistent) { + if (!vm->persistent) virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); - } goto cleanup; } =20 ret =3D libxlDomainStartRestore(driver, vm, (flags & VIR_DOMAIN_SAVE_PAUSED) !=3D 0, fd, hdr.version); - if (ret < 0 && !vm->persistent) { + if (ret < 0 && !vm->persistent) virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); - } =20 libxlDomainObjEndJob(driver, vm); =20 @@ -1893,7 +1869,6 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to,= unsigned int flags) libxlDriverConfigPtr cfg =3D libxlDriverConfigGet(driver); virDomainObjPtr vm; virObjectEventPtr event =3D NULL; - bool remove_dom =3D false; bool paused =3D false; int ret =3D -1; =20 @@ -1951,7 +1926,7 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to,= unsigned int flags) event =3D virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_S= TOPPED, VIR_DOMAIN_EVENT_STOPPED_CRASHED); if (!vm->persistent) - remove_dom =3D true; + virDomainObjListRemove(driver->domains, vm); } =20 ret =3D 0; @@ -1972,10 +1947,6 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to= , unsigned int flags) libxlDomainObjEndJob(driver, vm); =20 cleanup: - if (remove_dom && vm) { - virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); - } virDomainObjEndAPI(&vm); if (event) libxlDomainEventQueue(driver, event); @@ -1990,7 +1961,6 @@ libxlDomainManagedSave(virDomainPtr dom, unsigned int= flags) virDomainObjPtr vm =3D NULL; char *name =3D NULL; int ret =3D -1; - bool remove_dom =3D false; =20 virCheckFlags(0, -1); =20 @@ -2023,7 +1993,7 @@ libxlDomainManagedSave(virDomainPtr dom, unsigned int= flags) goto endjob; =20 if (!vm->persistent) - remove_dom =3D true; + virDomainObjListRemove(driver->domains, vm); =20 ret =3D 0; =20 @@ -2031,10 +2001,6 @@ libxlDomainManagedSave(virDomainPtr dom, unsigned in= t flags) libxlDomainObjEndJob(driver, vm); =20 cleanup: - if (remove_dom && vm) { - virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); - } virDomainObjEndAPI(&vm); VIR_FREE(name); return ret; @@ -2765,16 +2731,14 @@ libxlDomainDefineXMLFlags(virConnectPtr conn, const= char *xml, unsigned int flag 0, &oldDef))) goto cleanup; - - virObjectRef(vm); def =3D NULL; + vm->persistent =3D 1; =20 if (virDomainSaveConfig(cfg->configDir, cfg->caps, vm->newDef ? vm->newDef : vm->def) < 0) { virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); goto cleanup; } =20 @@ -2851,12 +2815,10 @@ libxlDomainUndefineFlags(virDomainPtr dom, event =3D virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_UNDEF= INED, VIR_DOMAIN_EVENT_UNDEFINED_REMOVED); =20 - if (virDomainObjIsActive(vm)) { + if (virDomainObjIsActive(vm)) vm->persistent =3D 0; - } else { + else virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); - } =20 ret =3D 0; =20 diff --git a/src/libxl/libxl_migration.c b/src/libxl/libxl_migration.c index d37a4a687a..206b878292 100644 --- a/src/libxl/libxl_migration.c +++ b/src/libxl/libxl_migration.c @@ -265,7 +265,6 @@ libxlDoMigrateDstReceive(void *opaque) int recvfd =3D args->recvfd; size_t i; int ret; - bool remove_dom =3D 0; =20 virObjectRef(vm); virObjectLock(vm); @@ -280,7 +279,7 @@ libxlDoMigrateDstReceive(void *opaque) args->migcookie->xenMigStreamVer); =20 if (ret < 0 && !vm->persistent) - remove_dom =3D true; + virDomainObjListRemove(driver->domains, vm); =20 /* Remove all listen socks from event handler, and close them. */ for (i =3D 0; i < nsocks; i++) { @@ -296,10 +295,6 @@ libxlDoMigrateDstReceive(void *opaque) libxlDomainObjEndJob(driver, vm); =20 cleanup: - if (remove_dom) { - virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); - } virDomainObjEndAPI(&vm); } =20 @@ -581,9 +576,8 @@ libxlDomainMigrationDstPrepareTunnel3(virConnectPtr dco= nn, VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, NULL))) goto error; - - virObjectRef(vm); *def =3D NULL; + priv =3D vm->privateData; =20 if (taint_hook) { @@ -633,10 +627,8 @@ libxlDomainMigrationDstPrepareTunnel3(virConnectPtr dc= onn, VIR_FORCE_CLOSE(dataFD[0]); virObjectUnref(args); /* Remove virDomainObj from domain list */ - if (vm) { + if (vm) virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); - } =20 done: virDomainObjEndAPI(&vm); @@ -680,9 +672,8 @@ libxlDomainMigrationDstPrepare(virConnectPtr dconn, VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, NULL))) goto error; - - virObjectRef(vm); *def =3D NULL; + priv =3D vm->privateData; =20 if (taint_hook) { @@ -807,10 +798,8 @@ libxlDomainMigrationDstPrepare(virConnectPtr dconn, priv->migrationPort =3D 0; } /* Remove virDomainObj from domain list */ - if (vm) { + if (vm) virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); - } =20 done: VIR_FREE(xmlout); @@ -1336,11 +1325,8 @@ libxlDomainMigrationDstFinish(virConnectPtr dconn, VIR_DOMAIN_SHUTOFF_FAILED); event =3D virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_S= TOPPED, VIR_DOMAIN_EVENT_STOPPED_FAILED); - if (!vm->persistent) { + if (!vm->persistent) virDomainObjListRemove(driver->domains, vm); - /* Caller passed a locked vm and expects the same on return */ - virObjectLock(vm); - } } =20 if (event) @@ -1392,11 +1378,8 @@ libxlDomainMigrationSrcConfirm(libxlDriverPrivatePtr= driver, if (flags & VIR_MIGRATE_UNDEFINE_SOURCE) virDomainDeleteConfig(cfg->configDir, cfg->autostartDir, vm); =20 - if (!vm->persistent || (flags & VIR_MIGRATE_UNDEFINE_SOURCE)) { + if (!vm->persistent || (flags & VIR_MIGRATE_UNDEFINE_SOURCE)) virDomainObjListRemove(driver->domains, vm); - /* Caller passed a locked vm and expects the same on return */ - virObjectLock(vm); - } =20 ret =3D 0; =20 diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index ca01d369d5..5fbc3fe666 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -478,14 +478,12 @@ lxcDomainDefineXMLFlags(virConnectPtr conn, const cha= r *xml, unsigned int flags) 0, &oldDef))) goto cleanup; =20 - virObjectRef(vm); def =3D NULL; vm->persistent =3D 1; =20 if (virDomainSaveConfig(cfg->configDir, driver->caps, vm->newDef ? vm->newDef : vm->def) < 0) { virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); goto cleanup; } =20 @@ -546,12 +544,10 @@ static int lxcDomainUndefineFlags(virDomainPtr dom, VIR_DOMAIN_EVENT_UNDEFINED, VIR_DOMAIN_EVENT_UNDEFINED_REMOVED); =20 - if (virDomainObjIsActive(vm)) { + if (virDomainObjIsActive(vm)) vm->persistent =3D 0; - } else { + else virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); - } =20 ret =3D 0; =20 @@ -1233,14 +1229,11 @@ lxcDomainCreateXMLWithFiles(virConnectPtr conn, VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, NULL))) goto cleanup; - virObjectRef(vm); def =3D NULL; =20 if (virLXCDomainObjBeginJob(driver, vm, LXC_JOB_MODIFY) < 0) { - if (!vm->persistent) { + if (!vm->persistent) virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); - } goto cleanup; } =20 @@ -1250,10 +1243,8 @@ lxcDomainCreateXMLWithFiles(virConnectPtr conn, VIR_DOMAIN_RUNNING_BOOTED) < 0) { virDomainAuditStart(vm, "booted", false); virLXCDomainObjEndJob(driver, vm); - if (!vm->persistent) { + if (!vm->persistent) virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); - } goto cleanup; } =20 @@ -1523,10 +1514,8 @@ lxcDomainDestroyFlags(virDomainPtr dom, =20 endjob: virLXCDomainObjEndJob(driver, vm); - if (!vm->persistent) { + if (!vm->persistent) virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); - } =20 cleanup: virDomainObjEndAPI(&vm); diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c index e911d88b56..e3849e00f0 100644 --- a/src/lxc/lxc_process.c +++ b/src/lxc/lxc_process.c @@ -671,10 +671,8 @@ static void virLXCProcessMonitorEOFNotify(virLXCMonito= rPtr mon, } else { VIR_DEBUG("Stop event has already been sent"); } - if (!vm->persistent) { + if (!vm->persistent) virDomainObjListRemove(driver->domains, vm); - vm =3D NULL; - } } else { int ret =3D virLXCProcessReboot(driver, vm); virDomainAuditStop(vm, "reboot"); @@ -685,15 +683,15 @@ static void virLXCProcessMonitorEOFNotify(virLXCMonit= orPtr mon, event =3D virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED, priv->stopReason); - if (!vm->persistent) { + if (!vm->persistent) virDomainObjListRemove(driver->domains, vm); - vm =3D NULL; - } } } =20 - if (vm) - virObjectUnlock(vm); + /* NB: virLXCProcessConnectMonitor will perform the virObjectRef(vm) + * before adding monitorCallbacks. Since we are now done with the @vm + * we can Unref/Unlock */ + virDomainObjEndAPI(&vm); if (event) virObjectEventStateQueue(driver->domainEventState, event); } @@ -803,7 +801,8 @@ static virLXCMonitorPtr virLXCProcessConnectMonitor(vir= LXCDriverPtr driver, goto cleanup; =20 /* Hold an extra reference because we can't allow 'vm' to be - * deleted while the monitor is active */ + * deleted while the monitor is active. This will be unreffed + * during EOFNotify processing. */ virObjectRef(vm); =20 monitor =3D virLXCMonitorNew(vm, cfg->stateDir, &monitorCallbacks); diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c index a25eaf570e..c2eda94f1c 100644 --- a/src/openvz/openvz_conf.c +++ b/src/openvz/openvz_conf.c @@ -611,7 +611,7 @@ int openvzLoadDomains(struct openvz_driver *driver) /* XXX OpenVZ doesn't appear to have concept of a transient domain= */ dom->persistent =3D 1; =20 - virObjectUnlock(dom); + virDomainObjEndAPI(&dom); dom =3D NULL; def =3D NULL; } diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index c10d6df663..14295dfda0 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -982,8 +982,7 @@ openvzDomainDefineXMLFlags(virConnectPtr conn, const ch= ar *xml, unsigned int fla =20 cleanup: virDomainDefFree(vmdef); - if (vm) - virObjectUnlock(vm); + virDomainObjEndAPI(&vm); openvzDriverUnlock(driver); return dom; } @@ -1071,8 +1070,7 @@ openvzDomainCreateXML(virConnectPtr conn, const char = *xml, =20 cleanup: virDomainDefFree(vmdef); - if (vm) - virObjectUnlock(vm); + virDomainObjEndAPI(&vm); openvzDriverUnlock(driver); return dom; } @@ -1151,12 +1149,10 @@ openvzDomainUndefineFlags(virDomainPtr dom, if (virRun(prog, NULL) < 0) goto cleanup; =20 - if (virDomainObjIsActive(vm)) { + if (virDomainObjIsActive(vm)) vm->persistent =3D 0; - } else { + else virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); - } =20 ret =3D 0; =20 @@ -2232,16 +2228,13 @@ openvzDomainMigratePrepare3Params(virConnectPtr dco= nn, =20 error: virDomainDefFree(def); - if (vm) { + if (vm) virDomainObjListRemove(driver->domains, vm); - vm =3D NULL; - } =20 done: VIR_FREE(my_hostname); virURIFree(uri); - if (vm) - virObjectUnlock(vm); + virDomainObjEndAPI(&vm); return ret; } =20 @@ -2396,7 +2389,6 @@ openvzDomainMigrateConfirm3Params(virDomainPtr domain, VIR_DEBUG("Domain '%s' successfully migrated", vm->def->name); =20 virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); =20 ret =3D 0; =20 diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 326c939c85..b0f72c4a62 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -7167,24 +7167,9 @@ qemuDomainRemoveInactive(virQEMUDriverPtr driver, VIR_FREE(snapDir); } =20 - virObjectRef(vm); - virDomainObjListRemove(driver->domains, vm); - /* - * virDomainObjListRemove() leaves the domain unlocked so it can - * be unref'd for other drivers that depend on that, but we still - * need to reset a job and we have a reference from the API that - * called this function. So we need to lock it back. This is - * just a workaround for the qemu driver. - * - * XXX: Ideally, the global handling of domain objects and object - * lists would be refactored so we don't need hacks like - * this, but since that requires refactor of all drivers, - * it's a work for another day. - */ - virObjectLock(vm); + virObjectUnref(cfg); - virObjectUnref(vm); } =20 =20 diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 7484b00e23..d67ef93fde 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1763,7 +1763,6 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr= conn, VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, NULL))) goto cleanup; - virObjectRef(vm); def =3D NULL; =20 if (qemuProcessBeginJob(driver, vm, VIR_DOMAIN_JOB_OPERATION_START, @@ -6735,7 +6734,6 @@ qemuDomainRestoreFlags(virConnectPtr conn, VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, NULL))) goto cleanup; - virObjectRef(vm); def =3D NULL; =20 if (flags & VIR_DOMAIN_SAVE_RUNNING) @@ -7409,9 +7407,8 @@ qemuDomainDefineXMLFlags(virConnectPtr conn, driver->xmlopt, 0, &oldDef))) goto cleanup; - - virObjectRef(vm); def =3D NULL; + if (qemuDomainHasBlockjob(vm, true)) { virReportError(VIR_ERR_BLOCK_COPY_ACTIVE, "%s", _("domain has active block job")); @@ -16407,7 +16404,6 @@ static virDomainPtr qemuDomainQemuAttach(virConnect= Ptr conn, NULL))) goto cleanup; =20 - virObjectRef(vm); def =3D NULL; =20 if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0) { diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 88b8253fa9..d4bbbe4c84 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -2279,9 +2279,8 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver, VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, NULL))) goto cleanup; - - virObjectRef(vm); *def =3D NULL; + priv =3D vm->privateData; if (VIR_STRDUP(priv->origname, origname) < 0) goto cleanup; diff --git a/src/test/test_driver.c b/src/test/test_driver.c index a1888c0c9f..4c701ca7d0 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -893,7 +893,7 @@ testParseDomains(testDriverPtr privconn, int num, ret =3D -1; size_t i; xmlNodePtr *nodes =3D NULL; - virDomainObjPtr obj; + virDomainObjPtr obj =3D NULL; =20 num =3D virXPathNodeSet("/node/domain", ctxt, &nodes); if (num < 0) @@ -921,10 +921,8 @@ testParseDomains(testDriverPtr privconn, goto error; } =20 - if (testParseDomainSnapshots(privconn, obj, file, ctxt) < 0) { - virObjectUnlock(obj); + if (testParseDomainSnapshots(privconn, obj, file, ctxt) < 0) goto error; - } =20 nsdata =3D def->namespaceData; obj->persistent =3D !nsdata->transient; @@ -932,20 +930,19 @@ testParseDomains(testDriverPtr privconn, =20 if (nsdata->runstate !=3D VIR_DOMAIN_SHUTOFF) { if (testDomainStartState(privconn, obj, - VIR_DOMAIN_RUNNING_BOOTED) < 0) { - virObjectUnlock(obj); + VIR_DOMAIN_RUNNING_BOOTED) < 0) goto error; - } } else { testDomainShutdownState(NULL, obj, 0); } virDomainObjSetState(obj, nsdata->runstate, 0); =20 - virObjectUnlock(obj); + virDomainObjEndAPI(&obj); } =20 ret =3D 0; error: + virDomainObjEndAPI(&obj); VIR_FREE(nodes); return ret; } @@ -1678,10 +1675,8 @@ testDomainCreateXML(virConnectPtr conn, const char *= xml, def =3D NULL; =20 if (testDomainStartState(privconn, dom, VIR_DOMAIN_RUNNING_BOOTED) < 0= ) { - if (!dom->persistent) { + if (!dom->persistent) virDomainObjListRemove(privconn->domains, dom); - dom =3D NULL; - } goto cleanup; } =20 @@ -1692,8 +1687,7 @@ testDomainCreateXML(virConnectPtr conn, const char *x= ml, ret =3D virGetDomain(conn, dom->def->name, dom->def->uuid, dom->def->i= d); =20 cleanup: - if (dom) - virObjectUnlock(dom); + virDomainObjEndAPI(&dom); testObjectEventQueue(privconn, event); virDomainDefFree(def); testDriverUnlock(privconn); @@ -1787,10 +1781,8 @@ static int testDomainDestroyFlags(virDomainPtr domai= n, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_DESTROYED); =20 - if (!privdom->persistent) { + if (!privdom->persistent) virDomainObjListRemove(privconn->domains, privdom); - virObjectLock(privdom); - } =20 ret =3D 0; cleanup: @@ -1888,10 +1880,8 @@ static int testDomainShutdownFlags(virDomainPtr doma= in, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN); =20 - if (!privdom->persistent) { + if (!privdom->persistent) virDomainObjListRemove(privconn->domains, privdom); - virObjectLock(privdom); - } =20 ret =3D 0; cleanup: @@ -1957,10 +1947,8 @@ static int testDomainReboot(virDomainPtr domain, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN= ); =20 - if (!privdom->persistent) { + if (!privdom->persistent) virDomainObjListRemove(privconn->domains, privdom); - virObjectLock(privdom); - } } =20 ret =3D 0; @@ -2095,10 +2083,8 @@ testDomainSaveFlags(virDomainPtr domain, const char = *path, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_SAVED); =20 - if (!privdom->persistent) { + if (!privdom->persistent) virDomainObjListRemove(privconn->domains, privdom); - virObjectLock(privdom); - } =20 ret =3D 0; cleanup: @@ -2200,10 +2186,8 @@ testDomainRestoreFlags(virConnectPtr conn, def =3D NULL; =20 if (testDomainStartState(privconn, dom, VIR_DOMAIN_RUNNING_RESTORED) <= 0) { - if (!dom->persistent) { + if (!dom->persistent) virDomainObjListRemove(privconn->domains, dom); - dom =3D NULL; - } goto cleanup; } =20 @@ -2216,8 +2200,7 @@ testDomainRestoreFlags(virConnectPtr conn, virDomainDefFree(def); VIR_FREE(xml); VIR_FORCE_CLOSE(fd); - if (dom) - virObjectUnlock(dom); + virDomainObjEndAPI(&dom); testObjectEventQueue(privconn, event); return ret; } @@ -2280,10 +2263,8 @@ static int testDomainCoreDumpWithFormat(virDomainPtr= domain, event =3D virDomainEventLifecycleNewFromObj(privdom, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_CRASHED); - if (!privdom->persistent) { + if (!privdom->persistent) virDomainObjListRemove(privconn->domains, privdom); - virObjectLock(privdom); - } } =20 ret =3D 0; @@ -2794,8 +2775,7 @@ static virDomainPtr testDomainDefineXMLFlags(virConne= ctPtr conn, cleanup: virDomainDefFree(def); virDomainDefFree(oldDef); - if (dom) - virObjectUnlock(dom); + virDomainObjEndAPI(&dom); testObjectEventQueue(privconn, event); return ret; } @@ -3062,12 +3042,10 @@ static int testDomainUndefineFlags(virDomainPtr dom= ain, VIR_DOMAIN_EVENT_UNDEFINED_REMOVED); privdom->hasManagedSave =3D false; =20 - if (virDomainObjIsActive(privdom)) { + if (virDomainObjIsActive(privdom)) privdom->persistent =3D 0; - } else { + else virDomainObjListRemove(privconn->domains, privdom); - virObjectLock(privdom); - } =20 ret =3D 0; =20 diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c index b50ba1ba64..fd109dcd9c 100644 --- a/src/uml/uml_driver.c +++ b/src/uml/uml_driver.c @@ -379,10 +379,8 @@ umlInotifyEvent(int watch, event =3D virDomainEventLifecycleNewFromObj(dom, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_SHUT= DOWN); - if (!dom->persistent) { + if (!dom->persistent) virDomainObjListRemove(driver->domains, dom); - virObjectLock(dom); - } } else if (e.mask & (IN_CREATE | IN_MODIFY)) { VIR_DEBUG("Got inotify domain startup '%s'", name); if (virDomainObjIsActive(dom)) { @@ -412,10 +410,8 @@ umlInotifyEvent(int watch, event =3D virDomainEventLifecycleNewFromObj(dom, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_= FAILED); - if (!dom->persistent) { + if (!dom->persistent) virDomainObjListRemove(driver->domains, dom); - virObjectLock(dom); - } } else if (umlIdentifyChrPTY(driver, dom) < 0) { VIR_WARN("Could not identify character devices for new dom= ain"); umlShutdownVMDaemon(driver, dom, @@ -424,10 +420,8 @@ umlInotifyEvent(int watch, event =3D virDomainEventLifecycleNewFromObj(dom, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_= FAILED); - if (!dom->persistent) { + if (!dom->persistent) virDomainObjListRemove(driver->domains, dom); - virObjectLock(dom); - } } } virDomainObjEndAPI(&dom); @@ -785,10 +779,8 @@ static int umlProcessAutoDestroyDom(void *payload, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_DESTROYED); =20 - if (!dom->persistent) { + if (!dom->persistent) virDomainObjListRemove(data->driver->domains, dom); - virObjectLock(dom); - } =20 virDomainObjEndAPI(&dom); if (event) @@ -1609,10 +1601,8 @@ static virDomainPtr umlDomainCreateXML(virConnectPtr= conn, const char *xml, if (umlStartVMDaemon(conn, driver, vm, (flags & VIR_DOMAIN_START_AUTODESTROY)) < 0) { virDomainAuditStart(vm, "booted", false); - if (!vm->persistent) { + if (!vm->persistent) virDomainObjListRemove(driver->domains, vm); - vm =3D NULL; - } goto cleanup; } virDomainAuditStart(vm, "booted", true); @@ -1624,8 +1614,7 @@ static virDomainPtr umlDomainCreateXML(virConnectPtr = conn, const char *xml, =20 cleanup: virDomainDefFree(def); - if (vm) - virObjectUnlock(vm); + virDomainObjEndAPI(&vm); if (event) umlDomainEventQueue(driver, event); umlDriverUnlock(driver); @@ -1694,10 +1683,8 @@ umlDomainDestroyFlags(virDomainPtr dom, event =3D virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_DESTROYED); - if (!vm->persistent) { + if (!vm->persistent) virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); - } ret =3D 0; =20 cleanup: @@ -2009,7 +1996,6 @@ umlDomainDefineXMLFlags(virConnectPtr conn, const cha= r *xml, unsigned int flags) if (virDomainSaveConfig(driver->configDir, driver->caps, vm->newDef ? vm->newDef : vm->def) < 0) { virDomainObjListRemove(driver->domains, vm); - vm =3D NULL; goto cleanup; } =20 @@ -2017,8 +2003,7 @@ umlDomainDefineXMLFlags(virConnectPtr conn, const cha= r *xml, unsigned int flags) =20 cleanup: virDomainDefFree(def); - if (vm) - virObjectUnlock(vm); + virDomainObjEndAPI(&vm); umlDriverUnlock(driver); return dom; } @@ -2054,12 +2039,10 @@ static int umlDomainUndefineFlags(virDomainPtr dom, if (virDomainDeleteConfig(driver->configDir, driver->autostartDir, vm)= < 0) goto cleanup; =20 - if (virDomainObjIsActive(vm)) { + if (virDomainObjIsActive(vm)) vm->persistent =3D 0; - } else { + else virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); - } =20 ret =3D 0; =20 diff --git a/src/vmware/vmware_conf.c b/src/vmware/vmware_conf.c index b9f18e6ac4..e1d6956df0 100644 --- a/src/vmware/vmware_conf.c +++ b/src/vmware/vmware_conf.c @@ -186,10 +186,9 @@ vmwareLoadDomains(struct vmware_driver *driver) VIR_DOMAIN_RUNNING_UNKNOWN); vm->persistent =3D 1; =20 - virObjectUnlock(vm); + virDomainObjEndAPI(&vm); =20 vmdef =3D NULL; - vm =3D NULL; } =20 ret =3D 0; diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c index 21c10b6605..f94b3252fe 100644 --- a/src/vmware/vmware_driver.c +++ b/src/vmware/vmware_driver.c @@ -502,10 +502,8 @@ vmwareDomainShutdownFlags(virDomainPtr dom, if (vmwareStopVM(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN) < 0) goto cleanup; =20 - if (!vm->persistent) { + if (!vm->persistent) virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); - } =20 ret =3D 0; cleanup: @@ -717,10 +715,8 @@ vmwareDomainCreateXML(virConnectPtr conn, const char *= xml, vmdef =3D NULL; =20 if (vmwareStartVM(driver, vm) < 0) { - if (!vm->persistent) { + if (!vm->persistent) virDomainObjListRemove(driver->domains, vm); - vm =3D NULL; - } goto cleanup; } =20 @@ -730,8 +726,7 @@ vmwareDomainCreateXML(virConnectPtr conn, const char *x= ml, virDomainDefFree(vmdef); VIR_FREE(vmx); VIR_FREE(vmxPath); - if (vm) - virObjectUnlock(vm); + virDomainObjEndAPI(&vm); vmwareDriverUnlock(driver); return dom; } @@ -796,12 +791,10 @@ vmwareDomainUndefineFlags(virDomainPtr dom, if (vmwareUpdateVMStatus(driver, vm) < 0) goto cleanup; =20 - if (virDomainObjIsActive(vm)) { + if (virDomainObjIsActive(vm)) vm->persistent =3D 0; - } else { + else virDomainObjListRemove(driver->domains, vm); - virObjectLock(vm); - } =20 ret =3D 0; =20 diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index d3fcae491a..48a9a866d9 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -3161,7 +3161,6 @@ vzDomainMigratePerformStep(virDomainObjPtr dom, goto cleanup; =20 virDomainObjListRemove(driver->domains, dom); - virObjectLock(dom); =20 ret =3D 0; =20 diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index bb8f15e4fe..cb82b9d582 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -1969,7 +1969,6 @@ prlsdkLoadDomain(vzDriverPtr driver, goto error; } =20 - virObjectRef(dom); pdom =3D dom->privateData; pdom->sdkdom =3D sdkdom; PrlHandle_AddRef(sdkdom); @@ -2235,7 +2234,6 @@ prlsdkHandleVmRemovedEvent(vzDriverPtr driver, VIR_DOMAIN_EVENT_UNDEFINED_REMOVED); =20 virDomainObjListRemove(driver->domains, dom); - virObjectLock(dom); virDomainObjEndAPI(&dom); return; } @@ -4334,7 +4332,6 @@ prlsdkUnregisterDomain(vzDriverPtr driver, virDomainO= bjPtr dom, unsigned int fla VIR_DOMAIN_EVENT_UNDEFINED_REMOVED); =20 virDomainObjListRemove(driver->domains, dom); - virObjectLock(dom); =20 ret =3D 0; cleanup: --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list