[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2] libxl: allow libxl_domain_suspend to simply suspend a domain, without saving it



On Wed, Mar 14, 2018 at 03:36:08PM +0100, Marek Marczykowski-Górecki wrote:
> When LIBXL_SUSPEND_NO_SAVE flag is set, no savefile will be written, but
> the domain will still be suspended (but not destroyed). The main reason
> for this functionality is to suspend the host while some domains are
> running, potentially holding PCI devices. This will give a chance to a
> driver in such a domain to properly suspend the device.
> 
> It would be better to have a separate function for this, but in fact it
> should be named libxl_domain_suspend, then the current one renamed to
> libxl_domain_save. Since that would break API compatibility, keep it in
> the same function.
> 
> Signed-off-by: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
> Signed-off-by: Marcus of Wetware Labs <marcus@xxxxxxxx>

Bump?

Any chances to get it into 4.11?

> ---
> Changes in v2:
>  - drop double initialization of dsps fields (libxl__domain_suspend_init
>    is called)
>  - use LIBXL_SUSPEND_NO_SAVE flag instead of fd=-1
> ---
>  tools/libxl/libxl.h        |  5 +++++
>  tools/libxl/libxl_domain.c | 52 
> +++++++++++++++++++++++++++++++++-------------
>  2 files changed, 42 insertions(+), 15 deletions(-)
> 
> diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
> index eca0ea2c50..636db77c2b 100644
> --- a/tools/libxl/libxl.h
> +++ b/tools/libxl/libxl.h
> @@ -1469,6 +1469,11 @@ int libxl_domain_suspend(libxl_ctx *ctx, uint32_t 
> domid, int fd,
>                           LIBXL_EXTERNAL_CALLERS_ONLY;
>  #define LIBXL_SUSPEND_DEBUG 1
>  #define LIBXL_SUSPEND_LIVE 2
> +/*
> + * Just transition the domain into suspended state, do not save its state to
> + * disk and do not destroy it. fd parameter is ignored.
> + */
> +#define LIBXL_SUSPEND_NO_SAVE 4
>  
>  /* @param suspend_cancel [from xenctrl.h:xc_domain_resume( @param fast )]
>   *   If this parameter is true, use co-operative resume. The guest
> diff --git a/tools/libxl/libxl_domain.c b/tools/libxl/libxl_domain.c
> index 13b1c73d40..0e9e245ce3 100644
> --- a/tools/libxl/libxl_domain.c
> +++ b/tools/libxl/libxl_domain.c
> @@ -486,6 +486,13 @@ static void domain_suspend_cb(libxl__egc *egc,
>  
>  }
>  
> +static void domain_suspend_empty_cb(libxl__egc *egc,
> +                              libxl__domain_suspend_state *dss, int rc)
> +{
> +    STATE_AO_GC(dss->ao);
> +    libxl__ao_complete(egc,ao,rc);
> +}
> +
>  int libxl_domain_suspend(libxl_ctx *ctx, uint32_t domid, int fd, int flags,
>                           const libxl_asyncop_how *ao_how)
>  {
> @@ -498,25 +505,40 @@ int libxl_domain_suspend(libxl_ctx *ctx, uint32_t 
> domid, int fd, int flags,
>          goto out_err;
>      }
>  
> -    libxl__domain_save_state *dss;
> -    GCNEW(dss);
> +    if (!(flags & LIBXL_SUSPEND_NO_SAVE)) {
> +        libxl__domain_save_state *dss;
>  
> -    dss->ao = ao;
> -    dss->callback = domain_suspend_cb;
> +        GCNEW(dss);
>  
> -    dss->domid = domid;
> -    dss->fd = fd;
> -    dss->type = type;
> -    dss->live = flags & LIBXL_SUSPEND_LIVE;
> -    dss->debug = flags & LIBXL_SUSPEND_DEBUG;
> -    dss->checkpointed_stream = LIBXL_CHECKPOINTED_STREAM_NONE;
> +        dss->ao = ao;
> +        dss->callback = domain_suspend_cb;
> +
> +        dss->domid = domid;
> +        dss->fd = fd;
> +        dss->type = type;
> +        dss->live = flags & LIBXL_SUSPEND_LIVE;
> +        dss->debug = flags & LIBXL_SUSPEND_DEBUG;
> +        dss->checkpointed_stream = LIBXL_CHECKPOINTED_STREAM_NONE;
> +
> +        rc = libxl__fd_flags_modify_save(gc, dss->fd,
> +                                         ~(O_NONBLOCK|O_NDELAY), 0,
> +                                         &dss->fdfl);
> +        if (rc < 0) goto out_err;
>  
> -    rc = libxl__fd_flags_modify_save(gc, dss->fd,
> -                                     ~(O_NONBLOCK|O_NDELAY), 0,
> -                                     &dss->fdfl);
> -    if (rc < 0) goto out_err;
> +        libxl__domain_save(egc, dss);
> +    } else {
> +        libxl__domain_suspend_state *dsps;
> +
> +        GCNEW(dsps);
> +        dsps->ao = ao;
> +        dsps->domid = domid;
> +        dsps->type = type;
> +        rc = libxl__domain_suspend_init(egc, dsps, type);
> +        if (rc < 0) goto out_err;
> +        dsps->callback_common_done = domain_suspend_empty_cb;
> +        libxl__domain_suspend(egc, dsps);
> +    }
>  
> -    libxl__domain_save(egc, dss);
>      return AO_INPROGRESS;
>  
>   out_err:

-- 
Best Regards,
Marek Marczykowski-Górecki
Invisible Things Lab
A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?

Attachment: signature.asc
Description: PGP signature

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.