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

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



On Fri, Feb 09, 2018 at 12:14:03AM +0100, Marek Marczykowski-Górecki wrote:
> When fd=-1, 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 device.
> 
> It would be better to have 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>
> ---
>  tools/libxl/libxl_domain.c | 53 
> +++++++++++++++++++++++++++++++++-------------
>  1 file changed, 38 insertions(+), 15 deletions(-)
> 
> diff --git a/tools/libxl/libxl_domain.c b/tools/libxl/libxl_domain.c
> index 13b1c73d40..c95eaa30ca 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,41 @@ 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 (fd >= 0) {
> +        libxl__domain_save_state *dss;

Newline.

> +        GCNEW(dss);
>  
> -    dss->ao = ao;
> -    dss->callback = domain_suspend_cb;
> +        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;
> +        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;

Newline.

> +        GCNEW(dsps);
> +        dsps->ao = ao;
> +        dsps->domid = domid;
> +        dsps->type = type;
> +        dsps->guest_evtchn.port = -1;
> +        dsps->guest_evtchn_lockfd = -1;
> +        dsps->guest_responded = 0;
> +        rc = libxl__domain_suspend_init(egc, dsps, type);

If you call libxl__domain_suspend_init just after allocating the
struct you can avoid setting type, port, guest_evtchn_lockfd and
guest_responded.

Thanks, Roger.

_______________________________________________
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®.