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

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



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>

---
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:
-- 
2.13.6


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