[libvirt] [RFC PATCH 06/10] qemu: implement state driver shutdown function

Daniel P. Berrange berrange at redhat.com
Wed Jan 10 18:05:27 UTC 2018


On Wed, Jan 10, 2018 at 12:23:31PM -0500, John Ferlan wrote:
> From: Nikolay Shirokovskiy <nshirokovskiy at virtuozzo.com>
> 
> Shutdown function should help API calls to finish when
> event loop is not running anymore. For this reason let's
> close agent and qemu monitors. These function will unblock
> API calls wating for response from qemu process or qemu agent.
> 
> Closing agent monitor and setting priv->agent to NULL when
> waiting for response is normal usecase (handling EOF from
> agent is handled the same way for example).
> 
> However we can not do the same for qemu monitor. This monitor is normally
> closed and unrefed during qemuProcessStop under destroy job so other threads
> do not deal with priv->mon. But if we take extra reference to monitor
> we are good. This can lead to double close but this function looks like to
> be idempotent.
> 
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
>  src/qemu/qemu_driver.c | 39 +++++++++++++++++++++++++++++++++++++++
>  1 file changed, 39 insertions(+)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index a203c9297..1de236cb5 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -1093,6 +1093,44 @@ qemuStateStop(void)
>      return ret;
>  }
>  
> +
> +static int
> +qemuDomainDisconnect(virDomainObjPtr vm, void *opaque ATTRIBUTE_UNUSED)
> +{
> +
> +    qemuDomainObjPrivatePtr priv;
> +
> +    virObjectLock(vm);
> +    priv = vm->privateData;
> +
> +    if (priv->mon) {
> +        /* Take extra reference to monitor so it won't be disposed
> +         * by qemuMonitorClose last unref. */
> +        virObjectRef(priv->mon);
> +        qemuMonitorClose(priv->mon);
> +    }
> +
> +    if (priv->agent) {
> +        /* Other threads are ready for priv->agent to became NULL meanwhile */
> +        qemuAgentClose(priv->agent);
> +        priv->agent = NULL;
> +    }
> +
> +    virObjectUnlock(vm);
> +    return 0;
> +}
> +
> +
> +static void
> +qemuStateShutdown(void)
> +{
> +    if (!qemu_driver)
> +        return;
> +
> +    virDomainObjListForEach(qemu_driver->domains, qemuDomainDisconnect, NULL);
> +}
> +
> +
>  /**
>   * qemuStateCleanup:
>   *
> @@ -21357,6 +21395,7 @@ static virStateDriver qemuStateDriver = {
>      .stateCleanup = qemuStateCleanup,
>      .stateReload = qemuStateReload,
>      .stateStop = qemuStateStop,
> +    .stateShutdown = qemuStateShutdown,

I'm curious why we need this separate  .stateShutdown hook. It feels like
this code could just be placed at the start of qemuStateStop and achieve
the same result.


Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|




More information about the libvir-list mailing list