[libvirt] [PATCH 4/5] Convert QEMU driver mutex into a rwlock

Daniel P. Berrange berrange at redhat.com
Wed Oct 14 10:48:53 UTC 2009


A number of driver API methods which acquire the driver mutex
only ever used the driver object in a read-only fashion. All
these uses are converted to call qemuDriverLockRO() allowing
for greater concurrency.

* src/qemu/qemu_conf.h: s/Mutex/RWLock/
* src/qemu/qemu_driver.c: Add a qemuDriverLockRO() method and use
  it anywhere that doesn't require a write lock on the driver
---
 src/qemu/qemu_conf.h   |    2 +-
 src/qemu/qemu_driver.c |  100 +++++++++++++++++++++++++++--------------------
 2 files changed, 58 insertions(+), 44 deletions(-)

diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index f9a970f..a6e68f8 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -75,7 +75,7 @@ enum qemud_cmd_flags {
 
 /* Main driver state */
 struct qemud_driver {
-    virMutex lock;
+    virRWLock lock;
 
     int privileged;
 
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 1eb7797..19187ac 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -78,13 +78,19 @@
 
 static int qemudShutdown(void);
 
+/* Obtains a full write lock */
 static void qemuDriverLock(struct qemud_driver *driver)
 {
-    virMutexLock(&driver->lock);
+    virRWLockWrite(&driver->lock);
+}
+/* Obtains a read-only lock */
+static void qemuDriverLockRO(struct qemud_driver *driver)
+{
+    virRWLockRead(&driver->lock);
 }
 static void qemuDriverUnlock(struct qemud_driver *driver)
 {
-    virMutexUnlock(&driver->lock);
+    virRWLockUnlock(&driver->lock);
 }
 
 static void qemuDomainEventFlush(int timer, void *opaque);
@@ -431,8 +437,8 @@ qemudStartup(int privileged) {
     if (VIR_ALLOC(qemu_driver) < 0)
         return -1;
 
-    if (virMutexInit(&qemu_driver->lock) < 0) {
-        VIR_ERROR("%s", _("cannot initialize mutex"));
+    if (virRWLockInit(&qemu_driver->lock) < 0) {
+        VIR_ERROR("%s", _("cannot initialize rwlock"));
         VIR_FREE(qemu_driver);
         return -1;
     }
@@ -743,7 +749,7 @@ qemudShutdown(void) {
     virCgroupFree(&qemu_driver->cgroup);
 
     qemuDriverUnlock(qemu_driver);
-    virMutexDestroy(&qemu_driver->lock);
+    virRWLockDestroy(&qemu_driver->lock);
     VIR_FREE(qemu_driver);
 
     return 0;
@@ -2262,7 +2268,7 @@ qemudDispatchVMEvent(int watch, int fd, int events, void *opaque) {
      * the VM must be running. Nowhere is allowed to remove
      * a domain while it is running, so it is safe to not
      * lock the driver here... */
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     virDomainObjLock(vm);
     qemuDriverUnlock(driver);
 
@@ -2520,7 +2526,7 @@ static virDomainPtr qemudDomainLookupByID(virConnectPtr conn,
     virDomainObjPtr vm;
     virDomainPtr dom = NULL;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm  = virDomainFindByID(&driver->domains, id);
     qemuDriverUnlock(driver);
 
@@ -2545,7 +2551,7 @@ static virDomainPtr qemudDomainLookupByUUID(virConnectPtr conn,
     virDomainObjPtr vm;
     virDomainPtr dom = NULL;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, uuid);
     qemuDriverUnlock(driver);
 
@@ -2572,7 +2578,7 @@ static virDomainPtr qemudDomainLookupByName(virConnectPtr conn,
     virDomainObjPtr vm;
     virDomainPtr dom = NULL;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByName(&driver->domains, name);
     qemuDriverUnlock(driver);
 
@@ -2626,7 +2632,7 @@ static int qemudListDomains(virConnectPtr conn, int *ids, int nids) {
     struct qemud_driver *driver = conn->privateData;
     int n;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     n = virDomainObjListGetActiveIDs(&driver->domains, ids, nids);
     qemuDriverUnlock(driver);
 
@@ -2637,7 +2643,7 @@ static int qemudNumDomains(virConnectPtr conn) {
     struct qemud_driver *driver = conn->privateData;
     int n;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     n = virDomainObjListNumOfDomains(&driver->domains, 1);
     qemuDriverUnlock(driver);
 
@@ -2731,7 +2737,7 @@ static int qemudDomainSuspend(virDomainPtr dom) {
     int ret = -1;
     virDomainEventPtr event = NULL;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
 
     if (!vm) {
@@ -2761,7 +2767,9 @@ static int qemudDomainSuspend(virDomainPtr dom) {
 cleanup:
     if (vm)
         virDomainObjUnlock(vm);
+    qemuDriverUnlock(driver);
 
+    qemuDriverLock(driver);
     if (event)
         qemuDomainEventQueue(driver, event);
     qemuDriverUnlock(driver);
@@ -2775,7 +2783,7 @@ static int qemudDomainResume(virDomainPtr dom) {
     int ret = -1;
     virDomainEventPtr event = NULL;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
 
     if (!vm) {
@@ -2809,6 +2817,8 @@ static int qemudDomainResume(virDomainPtr dom) {
 cleanup:
     if (vm)
         virDomainObjUnlock(vm);
+    qemuDriverUnlock(driver);
+    qemuDriverLock(driver);
     if (event)
         qemuDomainEventQueue(driver, event);
     qemuDriverUnlock(driver);
@@ -2821,7 +2831,7 @@ static int qemudDomainShutdown(virDomainPtr dom) {
     virDomainObjPtr vm;
     int ret = -1;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
     qemuDriverUnlock(driver);
 
@@ -2898,7 +2908,7 @@ static char *qemudDomainGetOSType(virDomainPtr dom) {
     virDomainObjPtr vm;
     char *type = NULL;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
     qemuDriverUnlock(driver);
     if (!vm) {
@@ -2924,7 +2934,7 @@ static unsigned long qemudDomainGetMaxMemory(virDomainPtr dom) {
     virDomainObjPtr vm;
     unsigned long ret = 0;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
     qemuDriverUnlock(driver);
 
@@ -2949,7 +2959,7 @@ static int qemudDomainSetMaxMemory(virDomainPtr dom, unsigned long newmax) {
     virDomainObjPtr vm;
     int ret = -1;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
     qemuDriverUnlock(driver);
 
@@ -2982,7 +2992,7 @@ static int qemudDomainSetMemory(virDomainPtr dom, unsigned long newmem) {
     virDomainObjPtr vm;
     int ret = -1;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
     qemuDriverUnlock(driver);
     if (!vm) {
@@ -3029,7 +3039,7 @@ static int qemudDomainGetInfo(virDomainPtr dom,
     int err;
     unsigned long balloon;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
     qemuDriverUnlock(driver);
     if (!vm) {
@@ -3257,7 +3267,7 @@ static int qemudDomainCoreDump(virDomainPtr dom,
         NULL,
     };
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
     qemuDriverUnlock(driver);
 
@@ -3314,7 +3324,7 @@ static int qemudDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus) {
     int ret = -1;
     const char *type;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
     qemuDriverUnlock(driver);
 
@@ -3375,7 +3385,7 @@ qemudDomainPinVcpu(virDomainPtr dom,
     virNodeInfo nodeinfo;
     int ret = -1;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
     qemuDriverUnlock(driver);
 
@@ -3444,7 +3454,7 @@ qemudDomainGetVcpus(virDomainPtr dom,
     int i, v, maxcpu;
     int ret = -1;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
     qemuDriverUnlock(driver);
 
@@ -3533,7 +3543,7 @@ static int qemudDomainGetMaxVcpus(virDomainPtr dom) {
     const char *type;
     int ret = -1;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
     qemuDriverUnlock(driver);
 
@@ -3567,7 +3577,7 @@ static int qemudDomainGetSecurityLabel(virDomainPtr dom, virSecurityLabelPtr sec
     const char *type;
     int ret = -1;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
 
     memset(seclabel, 0, sizeof(*seclabel));
@@ -3627,7 +3637,7 @@ static int qemudNodeGetSecurityModel(virConnectPtr conn,
     char *p;
     int ret = 0;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     if (!driver->securityDriver) {
         memset(secmodel, 0, sizeof (*secmodel));
         goto cleanup;
@@ -3843,7 +3853,7 @@ static char *qemudDomainDumpXML(virDomainPtr dom,
     unsigned long balloon;
     int err;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
     qemuDriverUnlock(driver);
 
@@ -3891,7 +3901,7 @@ static char *qemuDomainXMLFromNative(virConnectPtr conn,
         goto cleanup;
     }
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     def = qemuParseCommandLineString(conn, driver->caps, config);
     qemuDriverUnlock(driver);
     if (!def)
@@ -3921,7 +3931,7 @@ static char *qemuDomainXMLToNative(virConnectPtr conn,
     char *ret = NULL;
     int i;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
 
     if (STRNEQ(format, QEMU_CONFIG_FORMAT_ARGV)) {
         qemudReportError(conn, NULL, NULL, VIR_ERR_INVALID_ARG,
@@ -4038,7 +4048,7 @@ static int qemudListDefinedDomains(virConnectPtr conn,
     struct qemud_driver *driver = conn->privateData;
     int n;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     n = virDomainObjListGetInactiveNames(&driver->domains, names, nnames);
     qemuDriverUnlock(driver);
     return n;
@@ -4048,7 +4058,7 @@ static int qemudNumDefinedDomains(virConnectPtr conn) {
     struct qemud_driver *driver = conn->privateData;
     int n;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     n = virDomainObjListNumOfDomains(&driver->domains, 0);
     qemuDriverUnlock(driver);
 
@@ -4062,7 +4072,7 @@ static int qemudDomainStart(virDomainPtr dom) {
     int ret = -1;
     virDomainEventPtr event = NULL;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
 
     if (!vm) {
@@ -4082,6 +4092,8 @@ static int qemudDomainStart(virDomainPtr dom) {
 cleanup:
     if (vm)
         virDomainObjUnlock(vm);
+    qemuDriverUnlock(driver);
+    qemuDriverLock(driver);
     if (event)
         qemuDomainEventQueue(driver, event);
     qemuDriverUnlock(driver);
@@ -5151,7 +5163,7 @@ static int qemudDomainGetAutostart(virDomainPtr dom,
     virDomainObjPtr vm;
     int ret = -1;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
     qemuDriverUnlock(driver);
 
@@ -5179,7 +5191,7 @@ static int qemudDomainSetAutostart(virDomainPtr dom,
     char *configFile = NULL, *autostartLink = NULL;
     int ret = -1;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
 
     if (!vm) {
@@ -5249,7 +5261,7 @@ static char *qemuGetSchedulerType(virDomainPtr dom,
     struct qemud_driver *driver = dom->conn->privateData;
     char *ret = NULL;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     if (!qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_CPU)) {
         qemudReportError(dom->conn, dom, NULL, VIR_ERR_NO_SUPPORT,
                          __FUNCTION__);
@@ -5278,7 +5290,7 @@ static int qemuSetSchedulerParameters(virDomainPtr dom,
     virDomainObjPtr vm = NULL;
     int ret = -1;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     if (!qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_CPU)) {
         qemudReportError(dom->conn, dom, NULL, VIR_ERR_NO_SUPPORT,
                          __FUNCTION__);
@@ -5343,7 +5355,7 @@ static int qemuGetSchedulerParameters(virDomainPtr dom,
     int ret = -1;
     int rc;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     if (!qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_CPU)) {
         qemudReportError(dom->conn, dom, NULL, VIR_ERR_NO_SUPPORT,
                          __FUNCTION__);
@@ -5410,7 +5422,7 @@ qemudDomainBlockStats (virDomainPtr dom,
     virDomainObjPtr vm;
     virDomainDiskDefPtr disk = NULL;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
     qemuDriverUnlock(driver);
     if (!vm) {
@@ -5471,7 +5483,7 @@ qemudDomainInterfaceStats (virDomainPtr dom,
     int i;
     int ret = -1;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
     qemuDriverUnlock(driver);
 
@@ -5531,7 +5543,7 @@ qemudDomainBlockPeek (virDomainPtr dom,
     virDomainObjPtr vm;
     int fd = -1, ret = -1, i;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
     qemuDriverUnlock(driver);
 
@@ -5604,7 +5616,7 @@ qemudDomainMemoryPeek (virDomainPtr dom,
     char *tmp = NULL;
     int fd = -1, ret = -1;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
     qemuDriverUnlock(driver);
 
@@ -6759,7 +6771,7 @@ qemudDomainMigratePerform (virDomainPtr dom,
     int ret = -1;
     int paused = 0;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
     if (!vm) {
         char uuidstr[VIR_UUID_STRING_BUFLEN];
@@ -6831,6 +6843,8 @@ cleanup:
 
     if (vm)
         virDomainObjUnlock(vm);
+    qemuDriverUnlock(driver);
+    qemuDriverLock(driver);
     if (event)
         qemuDomainEventQueue(driver, event);
     qemuDriverUnlock(driver);
@@ -7038,7 +7052,7 @@ qemudNodeDeviceReset (virNodeDevicePtr dev)
     if (!pci)
         return -1;
 
-    qemuDriverLock(driver);
+    qemuDriverLockRO(driver);
 
     if (pciResetDevice(dev->conn, pci, driver->activePciHostdevs) < 0)
         goto out;
-- 
1.6.2.5




More information about the libvir-list mailing list