[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |