]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: fix nwfilter deadlock in qemuProcessReconnect
authorPavel Hrdina <phrdina@redhat.com>
Mon, 7 Aug 2017 12:42:58 +0000 (14:42 +0200)
committerPavel Hrdina <phrdina@redhat.com>
Mon, 14 Aug 2017 16:23:56 +0000 (18:23 +0200)
The correct lock order is:

  nwfilter driver lock (not used in this code path)
  nwfilter update lock
  virt driver lock (not used in this code path)
  domain object lock

but the current code have this order:

  domain object lock
  nwfilter update lock

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
src/qemu/qemu_process.c

index 0aecce3b1fea306ae3e2b5560fc7f55dcb7ce176..fed2bc588270f7addc87fcbe9611f7410ac7d723 100644 (file)
@@ -6813,8 +6813,6 @@ qemuProcessReconnect(void *opaque)
     if (qemuDomainMasterKeyReadFile(priv) < 0)
         goto error;
 
-    virNWFilterReadLockFilterUpdates();
-
     VIR_DEBUG("Reconnect monitor to %p '%s'", obj, obj->def->name);
 
     /* XXX check PID liveliness & EXE path */
@@ -7043,6 +7041,8 @@ qemuProcessReconnectHelper(virDomainObjPtr obj,
     memcpy(data, src, sizeof(*data));
     data->obj = obj;
 
+    virNWFilterReadLockFilterUpdates();
+
     /* this lock and reference will be eventually transferred to the thread
      * that handles the reconnect */
     virObjectLock(obj);
@@ -7068,6 +7068,7 @@ qemuProcessReconnectHelper(virDomainObjPtr obj,
         qemuDomainRemoveInactive(src->driver, obj);
 
         virDomainObjEndAPI(&obj);
+        virNWFilterUnlockFilterUpdates();
         virObjectUnref(data->conn);
         VIR_FREE(data);
         return -1;