[libvirt] [PATCH 0/2] fix some nwfilter deadlocks

Pavel Hrdina (2): qemu: fix nwfilter deadlock while reverting to snapshot qemu: fix nwfilter deadlock in qemuProcessReconnect src/qemu/qemu_driver.c | 2 +- src/qemu/qemu_process.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) -- 2.13.4

Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/qemu/qemu_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index b3f65f440d..0b549f20da 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -15325,7 +15325,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, virNWFilterReadLockFilterUpdates(); if (!(vm = qemuDomObjFromSnapshot(snapshot))) - return -1; + goto cleanup; cfg = virQEMUDriverGetConfig(driver); -- 2.13.4

On Mon, Aug 07, 2017 at 04:31:30PM +0200, Pavel Hrdina wrote:
Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/qemu/qemu_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index b3f65f440d..0b549f20da 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -15325,7 +15325,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, virNWFilterReadLockFilterUpdates();
if (!(vm = qemuDomObjFromSnapshot(snapshot))) - return -1; + goto cleanup;
cfg = virQEMUDriverGetConfig(driver);
ACK Introduced by commit 41127244fb90f08cf5032a5d7553f5f0390d925e Jan

On Mon, Aug 14, 2017 at 05:51:59PM +0200, Ján Tomko wrote:
On Mon, Aug 07, 2017 at 04:31:30PM +0200, Pavel Hrdina wrote:
Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/qemu/qemu_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index b3f65f440d..0b549f20da 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -15325,7 +15325,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, virNWFilterReadLockFilterUpdates();
if (!(vm = qemuDomObjFromSnapshot(snapshot))) - return -1; + goto cleanup;
cfg = virQEMUDriverGetConfig(driver);
ACK
Introduced by commit 41127244fb90f08cf5032a5d7553f5f0390d925e
Sigh :) I was hoping that nobody finds out. Anyway I've blamed myself in the commit message and pushed it, thanks. Pavel

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 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 0aecce3b1f..fed2bc5882 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -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; -- 2.13.4

On Mon, Aug 07, 2017 at 04:31:31PM +0200, Pavel Hrdina wrote:
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 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
ACK Jan
participants (2)
-
Ján Tomko
-
Pavel Hrdina