render / rpms / libvirt

Forked from rpms/libvirt 4 months ago
Clone
a1c947
From 0022c9aef2ecf60e9091e6df57e56065b14b67c5 Mon Sep 17 00:00:00 2001
a1c947
Message-Id: <0022c9aef2ecf60e9091e6df57e56065b14b67c5@dist-git>
a1c947
From: Jiri Denemark <jdenemar@redhat.com>
a1c947
Date: Thu, 28 Jul 2022 15:35:45 +0200
a1c947
Subject: [PATCH] qemu_migration_params: Avoid deadlock in
a1c947
 qemuMigrationParamsReset
a1c947
a1c947
In my recent comnmit v8.5.0-188-gc47f1abb81 I accidentally moved
a1c947
qemuMigrationParamsResetTLS after qemuDomainObjEnterMonitorAsync not
a1c947
noticing qemuMigrationParamsResetTLS will try to enter the monitor
a1c947
again. The second call will time out and return with a domain object
a1c947
locked. But we're still in monitor section and the object should be
a1c947
unlocked which means qemuDomainObjExitMonitor will deadlock trying to
a1c947
lock it again.
a1c947
a1c947
Fixes: c47f1abb81194461377a0c608a7ecd87f9ce9146
a1c947
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
a1c947
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
a1c947
(cherry picked from commit 8cb19a9b9a56ab6ebefc1f913c545e0bb86d4364)
a1c947
a1c947
https://bugzilla.redhat.com/show_bug.cgi?id=2107892
a1c947
a1c947
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
a1c947
---
a1c947
 src/qemu/qemu_migration_params.c | 12 +++++++++---
a1c947
 1 file changed, 9 insertions(+), 3 deletions(-)
a1c947
a1c947
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
a1c947
index 4a824ff5e1..4766d16e64 100644
a1c947
--- a/src/qemu/qemu_migration_params.c
a1c947
+++ b/src/qemu/qemu_migration_params.c
a1c947
@@ -1291,6 +1291,7 @@ qemuMigrationParamsReset(virQEMUDriver *driver,
a1c947
 {
a1c947
     virErrorPtr err;
a1c947
     g_autoptr(virBitmap) clearCaps = NULL;
a1c947
+    int rc;
a1c947
 
a1c947
     virErrorPreserveLast(&err;;
a1c947
 
a1c947
@@ -1305,11 +1306,16 @@ qemuMigrationParamsReset(virQEMUDriver *driver,
a1c947
 
a1c947
     clearCaps = virBitmapNew(0);
a1c947
 
a1c947
-    if (qemuMigrationParamsApplyCaps(vm, clearCaps) == 0 &&
a1c947
-        qemuMigrationParamsApplyValues(vm, origParams, false) == 0)
a1c947
-        qemuMigrationParamsResetTLS(driver, vm, asyncJob, origParams, apiFlags);
a1c947
+    rc = 0;
a1c947
+    if (qemuMigrationParamsApplyCaps(vm, clearCaps) < 0 ||
a1c947
+        qemuMigrationParamsApplyValues(vm, origParams, false) < 0)
a1c947
+        rc = -1;
a1c947
 
a1c947
     qemuDomainObjExitMonitor(vm);
a1c947
+    if (rc < 0)
a1c947
+        goto cleanup;
a1c947
+
a1c947
+    qemuMigrationParamsResetTLS(driver, vm, asyncJob, origParams, apiFlags);
a1c947
 
a1c947
  cleanup:
a1c947
     virErrorRestore(&err;;
a1c947
-- 
a1c947
2.35.1
a1c947