From: zithro / Cyril Rébert <slack@rabbit.lu>
The xl command doesn't provide suspend/resume, so add them :
xl suspend <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@citrix.com>
Suggested-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
Signed-off-by: Cyril Rébert (zithro) <slack@rabbit.lu>
Signed-off-by: Jason Andryuk <jason.andryuk@amd.com>
---
Rename command to just "suspend"
Move inside the HAVE_NO_SUSPEND_RESUME
---
docs/man/xl.1.pod.in | 12 ++++++++++++
tools/xl/xl.h | 2 ++
tools/xl/xl_cmdtable.c | 10 ++++++++++
tools/xl/xl_vmcontrol.c | 36 ++++++++++++++++++++++++++++++++++++
4 files changed, 60 insertions(+)
diff --git a/docs/man/xl.1.pod.in b/docs/man/xl.1.pod.in
index bed8393473..fe38724b2b 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.
+
=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,14 @@ in response to this event.
=back
+=item B<suspend> I<domain-id>
+
+Suspend a domain. This is a cooperative operation where the domain must
+respond to the xenstore trigger. When in a suspended state the domain
+still consumes allocated resources (such as memory), but is not 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 967d034cfe..45745f0dbb 100644
--- a/tools/xl/xl.h
+++ b/tools/xl/xl.h
@@ -129,6 +129,8 @@ int main_restore(int argc, char **argv);
int main_migrate_receive(int argc, char **argv);
int main_save(int argc, char **argv);
int main_migrate(int argc, char **argv);
+int main_suspend(int argc, char **argv);
+int main_resume(int argc, char **argv);
#endif
int main_dump_core(int argc, char **argv);
int main_pause(int argc, char **argv);
diff --git a/tools/xl/xl_cmdtable.c b/tools/xl/xl_cmdtable.c
index 53fc22d344..06a0039718 100644
--- a/tools/xl/xl_cmdtable.c
+++ b/tools/xl/xl_cmdtable.c
@@ -193,6 +193,16 @@ const struct cmd_spec cmd_table[] = {
"Restore a domain from a saved state",
"- for internal use only",
},
+ { "suspend",
+ &main_suspend, 0, 1,
+ "Suspend a domain to RAM",
+ "<Domain>",
+ },
+ { "resume",
+ &main_resume, 0, 1,
+ "Resume a domain from RAM",
+ "<Domain>",
+ },
#endif
{ "dump-core",
&main_dump_core, 0, 1,
diff --git a/tools/xl/xl_vmcontrol.c b/tools/xl/xl_vmcontrol.c
index c45d497c28..3160966972 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(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_suspend(int argc, char **argv)
+{
+ int opt;
+
+ SWITCH_FOREACH_OPT(opt, "", NULL, "suspend", 1) {
+ /* No options */
+ }
+
+ suspend_domain(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;
--
2.34.1
On Tue, Nov 26, 2024 at 12:19:41PM -0500, Jason Andryuk wrote: > diff --git a/tools/xl/xl_vmcontrol.c b/tools/xl/xl_vmcontrol.c > index c45d497c28..3160966972 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(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_suspend(int argc, char **argv) > +{ > + int opt; > + > + SWITCH_FOREACH_OPT(opt, "", NULL, "suspend", 1) { > + /* No options */ > + } > + > + suspend_domain(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; > +} These four new functions in xl_vmcontrol.c needs to be hidden behind LIBXL_HAVE_NO_SUSPEND_RESUME, like the whole xl_migrate.c file is. Both prototypes for main_*() are already hidden as well as the new command in xl_cmdtables. Or alternatively, we could probably have the command been present on Arm, but I don't know if libxl_domain_suspend_only() is going to work. It looks like it only depends on the hypervisor. I can't find any logic that would treat Arm differently, besides the presence of LIBXL_HAVE_NO_SUSPEND_RESUME. But best bet would be to hide those four functions when LIBXL_HAVE_NO_SUSPEND_RESUME is defined. Thanks, -- Anthony Perard | Vates XCP-ng Developer XCP-ng & Xen Orchestra - Vates solutions web: https://vates.tech
On 2024-11-28 12:19, Anthony PERARD wrote: > On Tue, Nov 26, 2024 at 12:19:41PM -0500, Jason Andryuk wrote: >> diff --git a/tools/xl/xl_vmcontrol.c b/tools/xl/xl_vmcontrol.c >> index c45d497c28..3160966972 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(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_suspend(int argc, char **argv) >> +{ >> + int opt; >> + >> + SWITCH_FOREACH_OPT(opt, "", NULL, "suspend", 1) { >> + /* No options */ >> + } >> + >> + suspend_domain(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; >> +} > > These four new functions in xl_vmcontrol.c needs to be hidden behind > LIBXL_HAVE_NO_SUSPEND_RESUME, like the whole xl_migrate.c file is. > Both prototypes for main_*() are already hidden as well as the new > command in xl_cmdtables. > > Or alternatively, we could probably have the command been present on > Arm, but I don't know if libxl_domain_suspend_only() is going to work. > It looks like it only depends on the hypervisor. I can't find any logic > that would treat Arm differently, besides the presence of > LIBXL_HAVE_NO_SUSPEND_RESUME. > > But best bet would be to hide those four functions when > LIBXL_HAVE_NO_SUSPEND_RESUME is defined. Thanks. Yes, I'll hide them. Regards, Jason
© 2016 - 2024 Red Hat, Inc.