From nobody Thu May 2 23:45:36 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 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1507668094467179.9645976953011; Tue, 10 Oct 2017 13:41:34 -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 BF7647EA94; Tue, 10 Oct 2017 20:41:32 +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 178CD6248F; Tue, 10 Oct 2017 20:41:32 +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 B8F69410B2; Tue, 10 Oct 2017 20:41:30 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v9AKKBTL008755 for ; Tue, 10 Oct 2017 16:20:11 -0400 Received: by smtp.corp.redhat.com (Postfix) id BC4F517C3D; Tue, 10 Oct 2017 20:20:11 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-116-36.phx2.redhat.com [10.3.116.36]) by smtp.corp.redhat.com (Postfix) with ESMTP id 854F868704 for ; Tue, 10 Oct 2017 20:20:10 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com BF7647EA94 Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: John Ferlan To: libvir-list@redhat.com Date: Tue, 10 Oct 2017 16:20:05 -0400 Message-Id: <20171010202006.23264-2-jferlan@redhat.com> In-Reply-To: <20171010202006.23264-1-jferlan@redhat.com> References: <20171010202006.23264-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 1/2] network: Convert virNetworkObjList to use RWObjectLockable 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.28]); Tue, 10 Oct 2017 20:41:33 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Let's use the RWObjectLockable for the various list lock mgmt. Only time need Write lock will be for Add, Remove, and Prune logic. Signed-off-by: John Ferlan Reviewed-by: Erik Skultety --- src/conf/virnetworkobj.c | 46 +++++++++++++++++++++++---------------------= -- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/conf/virnetworkobj.c b/src/conf/virnetworkobj.c index 20f846db5e..8cd1b62c1c 100644 --- a/src/conf/virnetworkobj.c +++ b/src/conf/virnetworkobj.c @@ -61,7 +61,7 @@ struct _virNetworkObj { }; =20 struct _virNetworkObjList { - virObjectLockable parent; + virObjectRWLockable parent; =20 virHashTablePtr objs; }; @@ -80,7 +80,7 @@ virNetworkObjOnceInit(void) virNetworkObjDispose))) return -1; =20 - if (!(virNetworkObjListClass =3D virClassNew(virClassForObjectLockable= (), + if (!(virNetworkObjListClass =3D virClassNew(virClassForObjectRWLockab= le(), "virNetworkObjList", sizeof(virNetworkObjList), virNetworkObjListDispose))) @@ -337,7 +337,7 @@ virNetworkObjListNew(void) if (virNetworkObjInitialize() < 0) return NULL; =20 - if (!(nets =3D virObjectLockableNew(virNetworkObjListClass))) + if (!(nets =3D virObjectRWLockableNew(virNetworkObjListClass))) return NULL; =20 if (!(nets->objs =3D virHashCreate(50, virObjectFreeHashData))) { @@ -381,9 +381,9 @@ virNetworkObjFindByUUID(virNetworkObjListPtr nets, { virNetworkObjPtr obj; =20 - virObjectLock(nets); + virObjectRWLockRead(nets); obj =3D virNetworkObjFindByUUIDLocked(nets, uuid); - virObjectUnlock(nets); + virObjectRWUnlock(nets); if (obj) virObjectLock(obj); return obj; @@ -435,9 +435,9 @@ virNetworkObjFindByName(virNetworkObjListPtr nets, { virNetworkObjPtr obj; =20 - virObjectLock(nets); + virObjectRWLockRead(nets); obj =3D virNetworkObjFindByNameLocked(nets, name); - virObjectUnlock(nets); + virObjectRWUnlock(nets); if (obj) virObjectLock(obj); return obj; @@ -638,9 +638,9 @@ virNetworkObjAssignDef(virNetworkObjListPtr nets, { virNetworkObjPtr obj; =20 - virObjectLock(nets); + virObjectRWLockWrite(nets); obj =3D virNetworkObjAssignDefLocked(nets, def, flags); - virObjectUnlock(nets); + virObjectRWUnlock(nets); return obj; } =20 @@ -789,10 +789,10 @@ virNetworkObjRemoveInactive(virNetworkObjListPtr nets, virUUIDFormat(obj->def->uuid, uuidstr); virObjectRef(obj); virObjectUnlock(obj); - virObjectLock(nets); + virObjectRWLockWrite(nets); virObjectLock(obj); virHashRemoveEntry(nets->objs, uuidstr); - virObjectUnlock(nets); + virObjectRWUnlock(nets); virObjectUnref(obj); } =20 @@ -1180,9 +1180,9 @@ virNetworkObjBridgeInUse(virNetworkObjListPtr nets, virNetworkObjPtr obj; struct virNetworkObjBridgeInUseHelperData data =3D {bridge, skipname}; =20 - virObjectLock(nets); + virObjectRWLockRead(nets); obj =3D virHashSearch(nets->objs, virNetworkObjBridgeInUseHelper, &dat= a, NULL); - virObjectUnlock(nets); + virObjectRWUnlock(nets); =20 return obj !=3D NULL; } @@ -1369,7 +1369,7 @@ virNetworkObjListExport(virConnectPtr conn, .conn =3D conn, .nets =3D NULL, .filter =3D filter, .flags =3D fla= gs, .nnets =3D 0, .error =3D false }; =20 - virObjectLock(netobjs); + virObjectRWLockRead(netobjs); if (nets && VIR_ALLOC_N(data.nets, virHashSize(netobjs->objs) + 1) < 0) goto cleanup; =20 @@ -1387,7 +1387,7 @@ virNetworkObjListExport(virConnectPtr conn, =20 ret =3D data.nnets; cleanup: - virObjectUnlock(netobjs); + virObjectRWUnlock(netobjs); while (data.nets && data.nnets) virObjectUnref(data.nets[--data.nnets]); =20 @@ -1435,9 +1435,9 @@ virNetworkObjListForEach(virNetworkObjListPtr nets, { struct virNetworkObjListForEachHelperData data =3D { .callback =3D callback, .opaque =3D opaque, .ret =3D 0}; - virObjectLock(nets); + virObjectRWLockRead(nets); virHashForEach(nets->objs, virNetworkObjListForEachHelper, &data); - virObjectUnlock(nets); + virObjectRWUnlock(nets); return data.ret; } =20 @@ -1503,9 +1503,9 @@ virNetworkObjListGetNames(virNetworkObjListPtr nets, .conn =3D conn, .filter =3D filter, .names =3D names, .nnames =3D = 0, .maxnames =3D maxnames, .active =3D active, .error =3D false}; =20 - virObjectLock(nets); + virObjectRWLockRead(nets); virHashForEach(nets->objs, virNetworkObjListGetHelper, &data); - virObjectUnlock(nets); + virObjectRWUnlock(nets); =20 if (data.error) goto cleanup; @@ -1530,9 +1530,9 @@ virNetworkObjListNumOfNetworks(virNetworkObjListPtr n= ets, .conn =3D conn, .filter =3D filter, .names =3D NULL, .nnames =3D 0, .maxnames =3D -1, .active =3D active, .error =3D false}; =20 - virObjectLock(nets); + virObjectRWLockRead(nets); virHashForEach(nets->objs, virNetworkObjListGetHelper, &data); - virObjectUnlock(nets); + virObjectRWUnlock(nets); =20 return data.nnames; } @@ -1572,7 +1572,7 @@ virNetworkObjListPrune(virNetworkObjListPtr nets, { struct virNetworkObjListPruneHelperData data =3D {flags}; =20 - virObjectLock(nets); + virObjectRWLockWrite(nets); virHashRemoveSet(nets->objs, virNetworkObjListPruneHelper, &data); - virObjectUnlock(nets); + virObjectRWUnlock(nets); } --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Thu May 2 23:45:36 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 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1507668119700545.8125187422029; Tue, 10 Oct 2017 13:41:59 -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 A02F67EA81; Tue, 10 Oct 2017 20:41:58 +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 7C32E174A8; Tue, 10 Oct 2017 20:41:58 +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 4290C18355D8; Tue, 10 Oct 2017 20:41:58 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v9AKKCnE008762 for ; Tue, 10 Oct 2017 16:20:12 -0400 Received: by smtp.corp.redhat.com (Postfix) id 1E14817C40; Tue, 10 Oct 2017 20:20:12 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-116-36.phx2.redhat.com [10.3.116.36]) by smtp.corp.redhat.com (Postfix) with ESMTP id DCBB917D01 for ; Tue, 10 Oct 2017 20:20:11 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com A02F67EA81 Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: John Ferlan To: libvir-list@redhat.com Date: Tue, 10 Oct 2017 16:20:06 -0400 Message-Id: <20171010202006.23264-3-jferlan@redhat.com> In-Reply-To: <20171010202006.23264-1-jferlan@redhat.com> References: <20171010202006.23264-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 2/2] network: Introduce virNetworkObjListForEachCb 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.28]); Tue, 10 Oct 2017 20:41:59 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Rather than separate callbacks for the NumOfNetworks, GetNames, and Export functions, let's combine them all into one multi-purpose callback. Signed-off-by: John Ferlan --- src/conf/virnetworkobj.c | 153 +++++++++++++++++++------------------------= ---- 1 file changed, 62 insertions(+), 91 deletions(-) diff --git a/src/conf/virnetworkobj.c b/src/conf/virnetworkobj.c index 8cd1b62c1c..40e3eb5ea0 100644 --- a/src/conf/virnetworkobj.c +++ b/src/conf/virnetworkobj.c @@ -1309,47 +1309,61 @@ virNetworkMatch(virNetworkObjPtr obj, #undef MATCH =20 =20 -struct virNetworkObjListData { +typedef bool (*virNetworkObjMatch)(virNetworkObjPtr obj, unsigned int flag= s); +struct _virNetworkObjForEachData { virConnectPtr conn; - virNetworkPtr *nets; virNetworkObjListFilter filter; + virNetworkObjMatch match; unsigned int flags; - int nnets; bool error; + bool checkActive; + bool active; + int nElems; + int maxElems; + char **const elems; + virNetworkPtr *nets; }; =20 static int -virNetworkObjListPopulate(void *payload, - const void *name ATTRIBUTE_UNUSED, - void *opaque) +virNetworkObjListForEachCb(void *payload, + const void *name ATTRIBUTE_UNUSED, + void *opaque) { - struct virNetworkObjListData *data =3D opaque; + struct _virNetworkObjForEachData *data =3D opaque; virNetworkObjPtr obj =3D payload; virNetworkPtr net =3D NULL; =20 if (data->error) return 0; =20 + if (data->maxElems >=3D 0 && data->nElems =3D=3D data->maxElems) + return 0; + virObjectLock(obj); =20 - if (data->filter && - !data->filter(data->conn, obj->def)) + if (data->filter && !data->filter(data->conn, obj->def)) goto cleanup; =20 - if (!virNetworkMatch(obj, data->flags)) + if (data->match && !virNetworkMatch(obj, data->flags)) goto cleanup; =20 - if (!data->nets) { - data->nnets++; + if (data->checkActive && data->active !=3D virNetworkObjIsActive(obj)) goto cleanup; - } =20 - if (!(net =3D virGetNetwork(data->conn, obj->def->name, obj->def->uuid= ))) { - data->error =3D true; - goto cleanup; + if (data->elems) { + if (VIR_STRDUP(data->elems[data->nElems], obj->def->name) < 0) { + data->error =3D true; + goto cleanup; + } + } else if (data->nets) { + if (!(net =3D virGetNetwork(data->conn, obj->def->name, obj->def->= uuid))) { + data->error =3D true; + goto cleanup; + } + data->nets[data->nElems] =3D net; } =20 - data->nets[data->nnets++] =3D net; + data->nElems++; =20 cleanup: virObjectUnlock(obj); @@ -1365,31 +1379,36 @@ virNetworkObjListExport(virConnectPtr conn, unsigned int flags) { int ret =3D -1; - struct virNetworkObjListData data =3D { - .conn =3D conn, .nets =3D NULL, .filter =3D filter, .flags =3D fla= gs, - .nnets =3D 0, .error =3D false }; + struct _virNetworkObjForEachData data =3D { + .conn =3D conn, .filter =3D filter, .match =3D virNetworkMatch, + .flags =3D flags, .checkActive =3D false, .active =3D false, .erro= r =3D false, + .nElems =3D 0, .maxElems =3D -1, .elems =3D NULL, .nets =3D NULL }; =20 virObjectRWLockRead(netobjs); if (nets && VIR_ALLOC_N(data.nets, virHashSize(netobjs->objs) + 1) < 0) goto cleanup; =20 - virHashForEach(netobjs->objs, virNetworkObjListPopulate, &data); + if (data.nets) + data.maxElems =3D virHashSize(netobjs->objs) + 1; + + virHashForEach(netobjs->objs, virNetworkObjListForEachCb, &data); =20 if (data.error) goto cleanup; =20 if (data.nets) { /* trim the array to the final size */ - ignore_value(VIR_REALLOC_N(data.nets, data.nnets + 1)); + ignore_value(VIR_REALLOC_N(data.nets, data.nElems + 1)); *nets =3D data.nets; data.nets =3D NULL; } =20 - ret =3D data.nnets; + ret =3D data.nElems; + cleanup: virObjectRWUnlock(netobjs); - while (data.nets && data.nnets) - virObjectUnref(data.nets[--data.nnets]); + while (data.nets && data.nElems) + virObjectUnref(data.nets[--data.nElems]); =20 VIR_FREE(data.nets); return ret; @@ -1442,53 +1461,6 @@ virNetworkObjListForEach(virNetworkObjListPtr nets, } =20 =20 -struct virNetworkObjListGetHelperData { - virConnectPtr conn; - virNetworkObjListFilter filter; - char **names; - int nnames; - int maxnames; - bool active; - bool error; -}; - -static int -virNetworkObjListGetHelper(void *payload, - const void *name ATTRIBUTE_UNUSED, - void *opaque) -{ - struct virNetworkObjListGetHelperData *data =3D opaque; - virNetworkObjPtr obj =3D payload; - - if (data->error) - return 0; - - if (data->maxnames >=3D 0 && - data->nnames =3D=3D data->maxnames) - return 0; - - virObjectLock(obj); - - if (data->filter && - !data->filter(data->conn, obj->def)) - goto cleanup; - - if ((data->active && virNetworkObjIsActive(obj)) || - (!data->active && !virNetworkObjIsActive(obj))) { - if (data->names && - VIR_STRDUP(data->names[data->nnames], obj->def->name) < 0) { - data->error =3D true; - goto cleanup; - } - data->nnames++; - } - - cleanup: - virObjectUnlock(obj); - return 0; -} - - int virNetworkObjListGetNames(virNetworkObjListPtr nets, bool active, @@ -1497,26 +1469,24 @@ virNetworkObjListGetNames(virNetworkObjListPtr nets, virNetworkObjListFilter filter, virConnectPtr conn) { - int ret =3D -1; - - struct virNetworkObjListGetHelperData data =3D { - .conn =3D conn, .filter =3D filter, .names =3D names, .nnames =3D = 0, - .maxnames =3D maxnames, .active =3D active, .error =3D false}; + struct _virNetworkObjForEachData data =3D { + .conn =3D conn, .filter =3D filter, .match =3D NULL, + .flags =3D 0, .checkActive =3D true, .active =3D active, .error = =3D false, + .nElems =3D 0, .maxElems =3D maxnames, .elems =3D names, .nets =3D= NULL }; =20 virObjectRWLockRead(nets); - virHashForEach(nets->objs, virNetworkObjListGetHelper, &data); + virHashForEach(nets->objs, virNetworkObjListForEachCb, &data); virObjectRWUnlock(nets); =20 if (data.error) - goto cleanup; + goto error; =20 - ret =3D data.nnames; - cleanup: - if (ret < 0) { - while (data.nnames) - VIR_FREE(data.names[--data.nnames]); - } - return ret; + return data.nElems; + + error: + while (data.nElems) + VIR_FREE(data.elems[--data.nElems]); + return -1; } =20 =20 @@ -1526,15 +1496,16 @@ virNetworkObjListNumOfNetworks(virNetworkObjListPtr= nets, virNetworkObjListFilter filter, virConnectPtr conn) { - struct virNetworkObjListGetHelperData data =3D { - .conn =3D conn, .filter =3D filter, .names =3D NULL, .nnames =3D 0, - .maxnames =3D -1, .active =3D active, .error =3D false}; + struct _virNetworkObjForEachData data =3D { + .conn =3D conn, .filter =3D filter, .match =3D NULL, + .flags =3D 0, .checkActive =3D true, .active =3D active, .error = =3D false, + .nElems =3D 0, .maxElems =3D -1, .elems =3D NULL, .nets =3D NULL }; =20 virObjectRWLockRead(nets); - virHashForEach(nets->objs, virNetworkObjListGetHelper, &data); + virHashForEach(nets->objs, virNetworkObjListForEachCb, &data); virObjectRWUnlock(nets); =20 - return data.nnames; + return data.nElems; } =20 =20 --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list