]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
nwfilter: fix deadlock caused updating network device and nwfilter
authorPavel Hrdina <phrdina@redhat.com>
Wed, 5 Nov 2014 13:28:57 +0000 (14:28 +0100)
committerCole Robinson <crobinso@redhat.com>
Sat, 15 Nov 2014 21:02:10 +0000 (16:02 -0500)
Commit 6e5c79a1 tried to fix deadlock between nwfilter{Define,Undefine}
and starting of guest, but this same deadlock exists for
updating/attaching network device to domain.

The deadlock was introduced by removing global QEMU driver lock because
nwfilter was counting on this lock and ensure that all driver locks are
locked inside of nwfilter{Define,Undefine}.

This patch extends usage of virNWFilterReadLockFilterUpdates to prevent
the deadlock for all possible paths in QEMU driver. LXC and UML drivers
still have global lock.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1143780

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
(cherry picked from commit 41127244fb90f08cf5032a5d7553f5f0390d925e)

src/qemu/qemu_driver.c
src/qemu/qemu_migration.c
src/qemu/qemu_process.c

index bb445fe70d6c155ebf9c6f91e2bb4039fa0bd6ea..b789189e62f6f69054fe149953d8faf5450f6134 100644 (file)
@@ -5700,6 +5700,8 @@ qemuDomainRestoreFlags(virConnectPtr conn,
                   VIR_DOMAIN_SAVE_PAUSED, -1);
 
 
+    virNWFilterReadLockFilterUpdates();
+
     fd = qemuDomainSaveImageOpen(driver, path, &def, &header, &xml,
                                  (flags & VIR_DOMAIN_SAVE_BYPASS_CACHE) != 0,
                                  &wrapperFd, false, false);
@@ -5777,6 +5779,7 @@ qemuDomainRestoreFlags(virConnectPtr conn,
     virFileWrapperFdFree(wrapperFd);
     if (vm)
         virObjectUnlock(vm);
+    virNWFilterUnlockFilterUpdates();
     return ret;
 }
 
@@ -7210,6 +7213,8 @@ static int qemuDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
     virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
                   VIR_DOMAIN_AFFECT_CONFIG, -1);
 
+    virNWFilterReadLockFilterUpdates();
+
     cfg = virQEMUDriverGetConfig(driver);
 
     affect = flags & (VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG);
@@ -7326,6 +7331,7 @@ static int qemuDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
         virObjectUnlock(vm);
     virObjectUnref(caps);
     virObjectUnref(cfg);
+    virNWFilterUnlockFilterUpdates();
     return ret;
 }
 
@@ -7356,6 +7362,8 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr dom,
                   VIR_DOMAIN_AFFECT_CONFIG |
                   VIR_DOMAIN_DEVICE_MODIFY_FORCE, -1);
 
+    virNWFilterReadLockFilterUpdates();
+
     cfg = virQEMUDriverGetConfig(driver);
 
     affect = flags & (VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG);
@@ -7472,6 +7480,7 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr dom,
         virObjectUnlock(vm);
     virObjectUnref(caps);
     virObjectUnref(cfg);
+    virNWFilterUnlockFilterUpdates();
     return ret;
 }
 
@@ -14159,6 +14168,8 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
      * and use of FORCE can cause multiple transitions.
      */
 
+    virNWFilterReadLockFilterUpdates();
+
     if (!(vm = qemuDomObjFromSnapshot(snapshot)))
         return -1;
 
@@ -14480,6 +14491,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
         virObjectUnlock(vm);
     virObjectUnref(caps);
     virObjectUnref(cfg);
+    virNWFilterUnlockFilterUpdates();
 
     return ret;
 }
index 9dac1e021eb28c31fd734409e5eac3e362add029..b3c911ee3058d29294bed5b4badfc49970769506 100644 (file)
@@ -57,6 +57,7 @@
 #include "virstring.h"
 #include "virtypedparam.h"
 #include "virprocess.h"
+#include "nwfilter_conf.h"
 
 #define VIR_FROM_THIS VIR_FROM_QEMU
 
@@ -2524,6 +2525,8 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
     if (virTimeMillisNow(&now) < 0)
         return -1;
 
+    virNWFilterReadLockFilterUpdates();
+
     if (flags & VIR_MIGRATE_OFFLINE) {
         if (flags & (VIR_MIGRATE_NON_SHARED_DISK |
                      VIR_MIGRATE_NON_SHARED_INC)) {
@@ -2833,6 +2836,7 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
         qemuDomainEventQueue(driver, event);
     qemuMigrationCookieFree(mig);
     virObjectUnref(caps);
+    virNWFilterUnlockFilterUpdates();
     return ret;
 
  stop:
index d254767beb9f03e6e990c7adf9ffcbbe41a3a181..a1f9c53b1a8df30fd2c9ff84fc8f5cd70ed122ef 100644 (file)
@@ -68,6 +68,7 @@
 #include "virhostdev.h"
 #include "storage/storage_driver.h"
 #include "configmake.h"
+#include "nwfilter_conf.h"
 
 #define VIR_FROM_THIS VIR_FROM_QEMU
 
@@ -3389,6 +3390,8 @@ qemuProcessReconnect(void *opaque)
 
     VIR_FREE(data);
 
+    virNWFilterReadLockFilterUpdates();
+
     virObjectLock(obj);
 
     cfg = virQEMUDriverGetConfig(driver);
@@ -3540,6 +3543,7 @@ qemuProcessReconnect(void *opaque)
 
     virObjectUnref(conn);
     virObjectUnref(cfg);
+    virNWFilterUnlockFilterUpdates();
 
     return;
 
@@ -3575,6 +3579,7 @@ qemuProcessReconnect(void *opaque)
     }
     virObjectUnref(conn);
     virObjectUnref(cfg);
+    virNWFilterUnlockFilterUpdates();
 }
 
 static int