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

Re: [PATCH] tools/xl: add suspend-to-ram and resume subcommands



Added my S-o-B (no other change).

On 29 Feb 2024 08:00, zithro / Cyril Rébert wrote:
The xl command doesn't provide suspend/resume, so add them :
   xl suspend-to-ram <Domain>
   xl resume <Domain>

This patch follows a discussion on XenDevel: when you want the
virtualized equivalent of "sleep"-ing a host, it's better to
suspend/resume than to pause/unpause a domain.

Suggested-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Suggested-by: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
Signed-off-by: Cyril Rébert (zithro) <slack@xxxxxxxxx>

---
- Tested on v4.17, x86
- the function "libxl_domain_resume" is called like libvirt does, so
   using a "co-operative resume", but I don't know what it means (:
- there may be a problem with the words resume <-> restore, like
   for "LIBXL_HAVE_NO_SUSPEND_RESUME"
- for the docs, I only slightly adapted a copy/paste from xl pause ...
---
---
  docs/man/xl.1.pod.in    | 10 ++++++++++
  tools/xl/xl.h           |  2 ++
  tools/xl/xl_cmdtable.c  | 10 ++++++++++
  tools/xl/xl_vmcontrol.c | 36 ++++++++++++++++++++++++++++++++++++
  4 files changed, 58 insertions(+)

diff --git a/docs/man/xl.1.pod.in b/docs/man/xl.1.pod.in
index bed8393473..63d80f1449 100644
--- a/docs/man/xl.1.pod.in
+++ b/docs/man/xl.1.pod.in
@@ -682,6 +682,10 @@ Pass the VNC password to vncviewer via stdin.
=back +=item B<resume> I<domain-id>
+
+Resume a domain, after having been suspended to RAM.
+
  =item B<save> [I<OPTIONS>] I<domain-id> I<checkpointfile> [I<configfile>]
Saves a running domain to a state file so that it can be restored
@@ -760,6 +764,12 @@ in response to this event.
=back +=item B<suspend-to-ram> I<domain-id>
+
+Suspend a domain to RAM.  When in a suspended state the domain will still
+consume allocated resources (such as memory), but will not be eligible for
+scheduling by the Xen hypervisor. It is in a shutdown state, but not dying.
+
  =item B<sysrq> I<domain-id> I<letter>
Send a <Magic System Request> to the domain, each type of request is
diff --git a/tools/xl/xl.h b/tools/xl/xl.h
index 9c86bb1d98..716ad32423 100644
--- a/tools/xl/xl.h
+++ b/tools/xl/xl.h
@@ -133,6 +133,8 @@ int main_migrate(int argc, char **argv);
  int main_dump_core(int argc, char **argv);
  int main_pause(int argc, char **argv);
  int main_unpause(int argc, char **argv);
+int main_suspendtoram(int argc, char **argv);
+int main_resume(int argc, char **argv);
  int main_destroy(int argc, char **argv);
  int main_shutdown(int argc, char **argv);
  int main_reboot(int argc, char **argv);
diff --git a/tools/xl/xl_cmdtable.c b/tools/xl/xl_cmdtable.c
index 62bdb2aeaa..1382282252 100644
--- a/tools/xl/xl_cmdtable.c
+++ b/tools/xl/xl_cmdtable.c
@@ -136,6 +136,16 @@ const struct cmd_spec cmd_table[] = {
        "Unpause a paused domain",
        "<Domain>",
      },
+    { "suspend-to-ram",
+      &main_suspendtoram, 0, 1,
+      "Suspend a domain to RAM",
+      "<Domain>",
+    },
+    { "resume",
+      &main_resume, 0, 1,
+      "Resume a domain from RAM",
+      "<Domain>",
+    },
      { "console",
        &main_console, 0, 0,
        "Attach to domain's console",
diff --git a/tools/xl/xl_vmcontrol.c b/tools/xl/xl_vmcontrol.c
index 98f6bd2e76..ba45f89c5a 100644
--- a/tools/xl/xl_vmcontrol.c
+++ b/tools/xl/xl_vmcontrol.c
@@ -42,6 +42,16 @@ static void unpause_domain(uint32_t domid)
      libxl_domain_unpause(ctx, domid, NULL);
  }
+static void suspend_domain_toram(uint32_t domid)
+{
+    libxl_domain_suspend_only(ctx, domid, NULL);
+}
+
+static void resume_domain(uint32_t domid)
+{
+    libxl_domain_resume(ctx, domid, 1, NULL);
+}
+
  static void destroy_domain(uint32_t domid, int force)
  {
      int rc;
@@ -82,6 +92,32 @@ int main_unpause(int argc, char **argv)
      return EXIT_SUCCESS;
  }
+int main_suspendtoram(int argc, char **argv)
+{
+    int opt;
+
+    SWITCH_FOREACH_OPT(opt, "", NULL, "suspend-to-ram", 1) {
+        /* No options */
+    }
+
+    suspend_domain_toram(find_domain(argv[optind]));
+
+    return EXIT_SUCCESS;
+}
+
+int main_resume(int argc, char **argv)
+{
+    int opt;
+
+    SWITCH_FOREACH_OPT(opt, "", NULL, "resume", 1) {
+        /* No options */
+    }
+
+    resume_domain(find_domain(argv[optind]));
+
+    return EXIT_SUCCESS;
+}
+
  int main_destroy(int argc, char **argv)
  {
      int opt;

--
++
zithro / Cyril




 


Rackspace

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