]> xenbits.xensource.com Git - 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)
committerPavel Hrdina <phrdina@redhat.com>
Thu, 13 Nov 2014 09:45:19 +0000 (10:45 +0100)
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>
src/qemu/qemu_driver.c
src/qemu/qemu_migration.c
src/qemu/qemu_process.c

index acf2b9a80067c514cd4587194a1aa2098b9953c6..411179d8be2e10f239d1b1b20065b94c52bba6a9 100644 (file)
@@ -5902,6 +5902,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);
@@ -5979,6 +5981,7 @@ qemuDomainRestoreFlags(virConnectPtr conn,
     virFileWrapperFdFree(wrapperFd);
     if (vm)
         virObjectUnlock(vm);
+    virNWFilterUnlockFilterUpdates();
     return ret;
 }
 
@@ -7500,6 +7503,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);
@@ -7616,6 +7621,7 @@ static int qemuDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
         virObjectUnlock(vm);
     virObjectUnref(caps);
     virObjectUnref(cfg);
+    virNWFilterUnlockFilterUpdates();
     return ret;
 }
 
@@ -7646,6 +7652,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);
@@ -7762,6 +7770,7 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr dom,
         virObjectUnlock(vm);
     virObjectUnref(caps);
     virObjectUnref(cfg);
+    virNWFilterUnlockFilterUpdates();
     return ret;
 }
 
@@ -14503,6 +14512,8 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
      * and use of FORCE can cause multiple transitions.
      */
 
+    virNWFilterReadLockFilterUpdates();
+
     if (!(vm = qemuDomObjFromSnapshot(snapshot)))
         return -1;
 
@@ -14824,6 +14835,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
         virObjectUnlock(vm);
     virObjectUnref(caps);
     virObjectUnref(cfg);
+    virNWFilterUnlockFilterUpdates();
 
     return ret;
 }
index c79720603ed03235d35efea0e53b7d40d03b5694..bef5b940fed4273f55d55aa1422ed231ae87d46b 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
 
@@ -2525,6 +2526,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)) {
@@ -2826,6 +2829,7 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
         qemuDomainEventQueue(driver, event);
     qemuMigrationCookieFree(mig);
     virObjectUnref(caps);
+    virNWFilterUnlockFilterUpdates();
     return ret;
 
  stop:
index 17dc8e530cee2d0ecab5fc4df12a61e80911623d..6350bfafa04d6ee98840888ba95b388eb4866b0c 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
 
@@ -3438,6 +3439,8 @@ qemuProcessReconnect(void *opaque)
 
     VIR_FREE(data);
 
+    virNWFilterReadLockFilterUpdates();
+
     virObjectLock(obj);
 
     cfg = virQEMUDriverGetConfig(driver);
@@ -3589,6 +3592,7 @@ qemuProcessReconnect(void *opaque)
 
     virObjectUnref(conn);
     virObjectUnref(cfg);
+    virNWFilterUnlockFilterUpdates();
 
     return;
 
@@ -3624,6 +3628,7 @@ qemuProcessReconnect(void *opaque)
     }
     virObjectUnref(conn);
     virObjectUnref(cfg);
+    virNWFilterUnlockFilterUpdates();
 }
 
 static int