[libvirt] [PATCH 2/2] qemu: hotplug: Reset device removal waiting code after vCPU unplug

Peter Krempa posted 2 patches 8 years, 11 months ago
[libvirt] [PATCH 2/2] qemu: hotplug: Reset device removal waiting code after vCPU unplug
Posted by Peter Krempa 8 years, 11 months ago
If the delivery of the DEVICE_DELETED event for the vCPU being deleted
would time out, the code would not call 'qemuDomainResetDeviceRemoval'.

Since the waiting thread did not unregister itself prior to stopping the
waiting the monitor code would try to wake it up instead of dispatching
it to the event worker. As a result the unplug process would not be
completed and the definition would not be updated.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1428893
          https://bugzilla.redhat.com/show_bug.cgi?id=1427801
---
 src/qemu/qemu_hotplug.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 889f110a9..636a806f0 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -5334,6 +5334,7 @@ qemuDomainHotplugDelVcpu(virQEMUDriverPtr driver,
     int oldvcpus = virDomainDefGetVcpus(vm->def);
     unsigned int nvcpus = vcpupriv->vcpus;
     int rc;
+    int ret = -1;

     if (!vcpupriv->alias) {
         virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
@@ -5348,11 +5349,11 @@ qemuDomainHotplugDelVcpu(virQEMUDriverPtr driver,
     rc = qemuMonitorDelDevice(qemuDomainGetMonitor(vm), vcpupriv->alias);

     if (qemuDomainObjExitMonitor(driver, vm) < 0)
-        return -1;
+        goto cleanup;

     if (rc < 0) {
         virDomainAuditVcpu(vm, oldvcpus, oldvcpus - nvcpus, "update", false);
-        return -1;
+        goto cleanup;
     }

     if ((rc = qemuDomainWaitForDeviceRemoval(vm)) <= 0) {
@@ -5360,10 +5361,17 @@ qemuDomainHotplugDelVcpu(virQEMUDriverPtr driver,
             virReportError(VIR_ERR_OPERATION_FAILED, "%s",
                            _("vcpu unplug request timed out"));

-        return -1;
+        goto cleanup;
     }

-    return qemuDomainRemoveVcpu(driver, vm, vcpu);
+    if (qemuDomainRemoveVcpu(driver, vm, vcpu) < 0)
+        goto cleanup;
+
+    ret = 0;
+
+ cleanup:
+    qemuDomainResetDeviceRemoval(vm);
+    return ret;
 }


-- 
2.12.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 2/2] qemu: hotplug: Reset device removal waiting code after vCPU unplug
Posted by Jiri Denemark 8 years, 11 months ago
On Fri, Mar 03, 2017 at 16:11:50 +0100, Peter Krempa wrote:
> If the delivery of the DEVICE_DELETED event for the vCPU being deleted
> would time out, the code would not call 'qemuDomainResetDeviceRemoval'.
> 
> Since the waiting thread did not unregister itself prior to stopping the
> waiting the monitor code would try to wake it up instead of dispatching
> it to the event worker. As a result the unplug process would not be
> completed and the definition would not be updated.
> 
> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1428893
>           https://bugzilla.redhat.com/show_bug.cgi?id=1427801
> ---
>  src/qemu/qemu_hotplug.c | 16 ++++++++++++----
>  1 file changed, 12 insertions(+), 4 deletions(-)

ACK

Jirka

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list