[libvirt] [PATCH 3/7] qemu: Use domain condition for device removal singalling

Peter Krempa pkrempa at redhat.com
Tue Apr 5 15:09:19 UTC 2016


No need to keep two separate conditions. A slight juggling of return
values is needed to accomodate virDomainObjWaitUntil.
---
 src/qemu/qemu_domain.c  |  4 ----
 src/qemu/qemu_domain.h  |  1 -
 src/qemu/qemu_hotplug.c | 19 +++++++++----------
 3 files changed, 9 insertions(+), 15 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index f38b0f3..8a673f8 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -586,9 +586,6 @@ qemuDomainObjPrivateAlloc(void)
         goto error;
     }

-    if (virCondInit(&priv->unplugFinished) < 0)
-        goto error;
-
     if (!(priv->devs = virChrdevAlloc()))
         goto error;

@@ -618,7 +615,6 @@ qemuDomainObjPrivateFree(void *data)
     VIR_FREE(priv->lockState);
     VIR_FREE(priv->origname);

-    virCondDestroy(&priv->unplugFinished);
     virStringFreeList(priv->qemuDevices);
     virChrdevFree(priv->devs);

diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 54d7bd7..2b92a90 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -198,7 +198,6 @@ struct _qemuDomainObjPrivate {

     virPerfPtr perf;

-    virCond unplugFinished; /* signals that unpluggingDevice was unplugged */
     const char *unpluggingDevice; /* alias of the device that is being unplugged */
     char **qemuDevices; /* NULL-terminated list of devices aliases known to QEMU */

diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 7317089..134f458 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -3364,6 +3364,7 @@ qemuDomainWaitForDeviceRemoval(virDomainObjPtr vm)
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
     unsigned long long until;
+    int rc;

     if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_DEL_EVENT))
         return 1;
@@ -3373,15 +3374,13 @@ qemuDomainWaitForDeviceRemoval(virDomainObjPtr vm)
     until += qemuDomainRemoveDeviceWaitTime;

     while (priv->unpluggingDevice) {
-        if (virCondWaitUntil(&priv->unplugFinished,
-                             &vm->parent.lock, until) < 0) {
-            if (errno == ETIMEDOUT) {
-                return 0;
-            } else {
-                VIR_WARN("Failed to wait on unplug condition for domain '%s' "
-                         "device '%s'", vm->def->name, priv->unpluggingDevice);
-                return 1;
-            }
+        if ((rc = virDomainObjWaitUntil(vm, until)) == 1)
+            return 0;
+
+        if (rc < 0) {
+            VIR_WARN("Failed to wait on unplug condition for domain '%s' "
+                     "device '%s'", vm->def->name, priv->unpluggingDevice);
+            return 1;
         }
     }

@@ -3402,7 +3401,7 @@ qemuDomainSignalDeviceRemoval(virDomainObjPtr vm,

     if (STREQ_NULLABLE(priv->unpluggingDevice, devAlias)) {
         qemuDomainResetDeviceRemoval(vm);
-        virCondSignal(&priv->unplugFinished);
+        virDomainObjBroadcast(vm);
         return true;
     }
     return false;
-- 
2.8.0




More information about the libvir-list mailing list