[PATCH v2 10/13] qemu: avoid deadlock in qemuDomainObjStopWorker

Daniel Henrique Barboza danielhb413 at gmail.com
Thu Aug 13 16:29:12 UTC 2020



On 7/23/20 7:14 AM, Nikolay Shirokovskiy wrote:
> We are dropping the only reference here so that the event loop thread
> is going to be exited synchronously. In order to avoid deadlocks we
> need to unlock the VM so that any handler being called can finish
> execution and thus even loop thread be finished too.
> 
> Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy at virtuozzo.com>
> ---

Reviewed-by: Daniel Henrique Barboza <danielhb413 at gmail.com>

>   src/qemu/qemu_domain.c | 18 ++++++++++++++----
>   1 file changed, 14 insertions(+), 4 deletions(-)
> 
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 5b22eb2..82b3d11 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -1637,11 +1637,21 @@ void
>   qemuDomainObjStopWorker(virDomainObjPtr dom)
>   {
>       qemuDomainObjPrivatePtr priv = dom->privateData;
> +    virEventThread *eventThread;
>   
> -    if (priv->eventThread) {
> -        g_object_unref(priv->eventThread);
> -        priv->eventThread = NULL;
> -    }
> +    if (!priv->eventThread)
> +        return;
> +
> +    /*
> +     * We are dropping the only reference here so that the event loop thread
> +     * is going to be exited synchronously. In order to avoid deadlocks we
> +     * need to unlock the VM so that any handler being called can finish
> +     * execution and thus even loop thread be finished too.
> +     */
> +    eventThread = g_steal_pointer(&priv->eventThread);
> +    virObjectUnlock(dom);
> +    g_object_unref(eventThread);
> +    virObjectLock(dom);
>   }
>   
>   
> 




More information about the libvir-list mailing list