From nobody Fri May 16 05:10:37 2025 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 1501156067455681.9326449862729; Thu, 27 Jul 2017 04:47:47 -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 8387940220; Thu, 27 Jul 2017 11:47:45 +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 362F86F9EC; Thu, 27 Jul 2017 11:47:45 +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 CED8B180BA81; Thu, 27 Jul 2017 11:47:44 +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 v6RBlb0L028592 for ; Thu, 27 Jul 2017 07:47:37 -0400 Received: by smtp.corp.redhat.com (Postfix) id 832D55D73C; Thu, 27 Jul 2017 11:47:37 +0000 (UTC) Received: from moe.brq.redhat.com (unknown [10.43.2.192]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0B9175D72D for ; Thu, 27 Jul 2017 11:47:36 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 8387940220 Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: Michal Privoznik To: libvir-list@redhat.com Date: Thu, 27 Jul 2017 13:47:27 +0200 Message-Id: In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 7/7] storageDriver: Use RW locks 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.30]); Thu, 27 Jul 2017 11:47:46 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Currently, the storage driver doesn't have virStoragePoolList object. It maintains the list itself. To mutually exclude two threads trying to access it mutexes are used. However, this hurts performance as there's no reason why two threads reading from the list cannot run at the same time. Signed-off-by: Michal Privoznik --- src/conf/virstorageobj.h | 2 +- src/storage/storage_driver.c | 42 +++++++++++++++++++++++-----------------= -- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/conf/virstorageobj.h b/src/conf/virstorageobj.h index 5a61b2aa6..585c63869 100644 --- a/src/conf/virstorageobj.h +++ b/src/conf/virstorageobj.h @@ -53,7 +53,7 @@ typedef struct _virStorageDriverState virStorageDriverSta= te; typedef virStorageDriverState *virStorageDriverStatePtr; =20 struct _virStorageDriverState { - virMutex lock; + virRWLock lock; =20 virStoragePoolObjList pools; =20 diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index f162f2e5a..b2ba667ef 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -70,11 +70,15 @@ struct _virStorageVolStreamInfo { =20 static void storageDriverLock(void) { - virMutexLock(&driver->lock); + virRWLockWrite(&driver->lock); +} +static void storageDriverLockRead(void) +{ + virRWLockRead(&driver->lock); } static void storageDriverUnlock(void) { - virMutexUnlock(&driver->lock); + virRWLockUnlock(&driver->lock); } =20 =20 @@ -253,7 +257,7 @@ storageStateInitialize(bool privileged, if (VIR_ALLOC(driver) < 0) return ret; =20 - if (virMutexInit(&driver->lock) < 0) { + if (virRWLockInit(&driver->lock) < 0) { virReportSystemError(errno, "%s", _("cannot initialize storage driver lock")); VIR_FREE(driver); @@ -382,7 +386,7 @@ storageStateCleanup(void) VIR_FREE(driver->autostartDir); VIR_FREE(driver->stateDir); storageDriverUnlock(); - virMutexDestroy(&driver->lock); + virRWLockDestroy(&driver->lock); VIR_FREE(driver); =20 return 0; @@ -417,7 +421,7 @@ virStoragePoolObjFromStoragePool(virStoragePoolPtr pool) { virStoragePoolObjPtr ret; =20 - storageDriverLock(); + storageDriverLockRead(); ret =3D storagePoolObjFindByUUID(pool->uuid, pool->name); storageDriverUnlock(); =20 @@ -430,7 +434,7 @@ storagePoolObjFindByName(const char *name) { virStoragePoolObjPtr obj; =20 - storageDriverLock(); + storageDriverLockRead(); if (!(obj =3D virStoragePoolObjFindByName(&driver->pools, name))) virReportError(VIR_ERR_NO_STORAGE_POOL, _("no storage pool with matching name '%s'"), name); @@ -447,7 +451,7 @@ storagePoolLookupByUUID(virConnectPtr conn, virStoragePoolObjPtr obj; virStoragePoolPtr pool =3D NULL; =20 - storageDriverLock(); + storageDriverLockRead(); obj =3D storagePoolObjFindByUUID(uuid, NULL); storageDriverUnlock(); if (!obj) @@ -511,7 +515,7 @@ storageConnectNumOfStoragePools(virConnectPtr conn) if (virConnectNumOfStoragePoolsEnsureACL(conn) < 0) return -1; =20 - storageDriverLock(); + storageDriverLockRead(); nactive =3D virStoragePoolObjNumOfStoragePools(&driver->pools, conn, t= rue, virConnectNumOfStoragePoo= lsCheckACL); storageDriverUnlock(); @@ -530,7 +534,7 @@ storageConnectListStoragePools(virConnectPtr conn, if (virConnectListStoragePoolsEnsureACL(conn) < 0) return -1; =20 - storageDriverLock(); + storageDriverLockRead(); got =3D virStoragePoolObjGetNames(&driver->pools, conn, true, virConnectListStoragePoolsCheckACL, names, maxnames); @@ -546,7 +550,7 @@ storageConnectNumOfDefinedStoragePools(virConnectPtr co= nn) if (virConnectNumOfDefinedStoragePoolsEnsureACL(conn) < 0) return -1; =20 - storageDriverLock(); + storageDriverLockRead(); nactive =3D virStoragePoolObjNumOfStoragePools(&driver->pools, conn, f= alse, virConnectNumOfDefinedSto= ragePoolsCheckACL); storageDriverUnlock(); @@ -565,7 +569,7 @@ storageConnectListDefinedStoragePools(virConnectPtr con= n, if (virConnectListDefinedStoragePoolsEnsureACL(conn) < 0) return -1; =20 - storageDriverLock(); + storageDriverLockRead(); got =3D virStoragePoolObjGetNames(&driver->pools, conn, false, virConnectListDefinedStoragePoolsCheck= ACL, names, maxnames); @@ -1457,7 +1461,7 @@ storageVolLookupByKey(virConnectPtr conn, size_t i; virStorageVolPtr vol =3D NULL; =20 - storageDriverLock(); + storageDriverLockRead(); for (i =3D 0; i < driver->pools.count && !vol; i++) { virStoragePoolObjLock(driver->pools.objs[i]); if (virStoragePoolObjIsActive(driver->pools.objs[i])) { @@ -1502,7 +1506,7 @@ storageVolLookupByPath(virConnectPtr conn, if (!cleanpath) return NULL; =20 - storageDriverLock(); + storageDriverLockRead(); for (i =3D 0; i < driver->pools.count && !vol; i++) { virStoragePoolObjPtr obj =3D driver->pools.objs[i]; virStorageVolDefPtr voldef; @@ -1597,7 +1601,7 @@ storagePoolLookupByTargetPath(virConnectPtr conn, if (!cleanpath) return NULL; =20 - storageDriverLock(); + storageDriverLockRead(); for (i =3D 0; i < driver->pools.count && !pool; i++) { virStoragePoolObjPtr obj =3D driver->pools.objs[i]; =20 @@ -1860,7 +1864,7 @@ storageVolCreateXML(virStoragePoolPtr pool, =20 VIR_FREE(buildvoldef); =20 - storageDriverLock(); + storageDriverLockRead(); virStoragePoolObjLock(obj); storageDriverUnlock(); =20 @@ -1926,7 +1930,7 @@ storageVolCreateXMLFrom(virStoragePoolPtr pool, VIR_STORAGE_VOL_CREATE_REFLINK, NULL); =20 - storageDriverLock(); + storageDriverLockRead(); obj =3D virStoragePoolObjFindByUUID(&driver->pools, pool->uuid); if (obj && STRNEQ(pool->name, volsrc->pool)) { virStoragePoolObjUnlock(obj); @@ -2060,7 +2064,7 @@ storageVolCreateXMLFrom(virStoragePoolPtr pool, =20 buildret =3D backend->buildVolFrom(pool->conn, obj, shadowvol, voldefs= rc, flags); =20 - storageDriverLock(); + storageDriverLockRead(); virStoragePoolObjLock(obj); if (objsrc) virStoragePoolObjLock(objsrc); @@ -2624,7 +2628,7 @@ storageConnectListAllStoragePools(virConnectPtr conn, if (virConnectListAllStoragePoolsEnsureACL(conn) < 0) goto cleanup; =20 - storageDriverLock(); + storageDriverLockRead(); ret =3D virStoragePoolObjListExport(conn, &driver->pools, pools, virConnectListAllStoragePoolsCheckAC= L, flags); @@ -3029,7 +3033,7 @@ virStoragePoolObjFindPoolByUUID(const unsigned char *= uuid) { virStoragePoolObjPtr obj; =20 - storageDriverLock(); + storageDriverLockRead(); obj =3D virStoragePoolObjFindByUUID(&driver->pools, uuid); storageDriverUnlock(); return obj; --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list