[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] libxl: allow libxl_domain_suspend to simply suspend a domain, without saving it
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; + 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; + 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 (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: -- 2.13.6 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |