mirror of https://gitee.com/openkylin/libvirt.git
nwfilter: fix deadlock caused updating network device and nwfilter
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>
This commit is contained in:
parent
54ddc08ddb
commit
41127244fb
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue