[libvirt] [PATCH] qemu: Remove double unlock for domains
Martin Kletzander
mkletzan at redhat.com
Mon Aug 3 11:11:27 UTC 2015
On Wed, Jul 15, 2015 at 09:17:46AM +0200, Martin Kletzander wrote:
>The virDomainObjListRemove() function unlocks a domain that it's given
>due to legacy code. And because of that code, which should be
>refactored, that last virObjectUnlock() cannot be just removed. So
>instead, lock it right back for qemu for now. All calls to
>qemuDomainRemoveInactive() are followed by code that unlocks the domain
>again, plus the domain should be locked during qemuDomainObjEndJob(), so
>the right place to lock it is right after virDomainObjListRemove().
>
>The only place where this would cause a problem is the autodestroy
>callback, so we need to get another reference there and uref+unlock it
>afterwards. Luckily, returning NULL from that function doesn't mean an
>error, and only means that it doesn't need to be unlocked anymore.
>
>Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
>---
Post-release ping
> src/qemu/qemu_domain.c | 7 +++++++
> src/qemu/qemu_process.c | 7 ++++---
> 2 files changed, 11 insertions(+), 3 deletions(-)
>
>diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
>index 8b050a043995..d6d723112638 100644
>--- a/src/qemu/qemu_domain.c
>+++ b/src/qemu/qemu_domain.c
>@@ -2593,6 +2593,13 @@ qemuDomainRemoveInactive(virQEMUDriverPtr driver,
> virObjectRef(vm);
>
> virDomainObjListRemove(driver->domains, vm);
>+ /*
>+ * virDomainObjListRemove() leaves the domain unlocked so it can
>+ * be unref'd for other drivers that depend on that, but we still
>+ * need to reset a job and we have a reference from the API that
>+ * called this function. So we need to lock it back.
>+ */
>+ virObjectLock(vm);
> virObjectUnref(cfg);
>
> if (haveJob)
>diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
>index 1c0c734c3811..df38dacdca92 100644
>--- a/src/qemu/qemu_process.c
>+++ b/src/qemu/qemu_process.c
>@@ -5696,6 +5696,8 @@ qemuProcessAutoDestroy(virDomainObjPtr dom,
>
> VIR_DEBUG("vm=%s, conn=%p", dom->def->name, conn);
>
>+ virObjectRef(dom);
>+
> if (priv->job.asyncJob) {
> VIR_DEBUG("vm=%s has long-term job active, cancelling",
> dom->def->name);
>@@ -5718,15 +5720,14 @@ qemuProcessAutoDestroy(virDomainObjPtr dom,
>
> qemuDomainObjEndJob(driver, dom);
>
>- if (!dom->persistent) {
>+ if (!dom->persistent)
> qemuDomainRemoveInactive(driver, dom);
>- dom = NULL;
>- }
>
> if (event)
> qemuDomainEventQueue(driver, event);
>
> cleanup:
>+ virDomainObjEndAPI(&dom);
> return dom;
> }
>
>--
>2.4.5
>
>--
>libvir-list mailing list
>libvir-list at redhat.com
>https://www.redhat.com/mailman/listinfo/libvir-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150803/76b58c8d/attachment-0001.sig>
More information about the libvir-list
mailing list