aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxl
diff options
context:
space:
mode:
authorIan Campbell <ian.campbell@citrix.com>2012-10-18 09:35:11 +0100
committerIan Campbell <ian.campbell@citrix.com>2012-10-18 09:35:11 +0100
commitccf1c30d488193abb7875d470015a86acc9d45b0 (patch)
tree80b3356cfa1ad992ac358d89fcb09b677d828e80 /tools/libxl
parent710820bc4e20ce9750d6dc23412a1c2ba6d0c037 (diff)
downloadxen-ccf1c30d488193abb7875d470015a86acc9d45b0.tar.gz
xen-ccf1c30d488193abb7875d470015a86acc9d45b0.tar.bz2
xen-ccf1c30d488193abb7875d470015a86acc9d45b0.zip
xl: Add --wait and --all to xl reboot.
Inspired by a patch by Sander Eikelenboom. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Acked-by: Ian Jackson <ian.jackson@eu.citrix.com> Committed-by: Ian Campbell <ian.campbell@citrix.com>
Diffstat (limited to 'tools/libxl')
-rw-r--r--tools/libxl/xl_cmdimpl.c51
-rw-r--r--tools/libxl/xl_cmdtable.c4
2 files changed, 29 insertions, 26 deletions
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index c50a7c8fcc..dc80595889 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -2716,7 +2716,7 @@ static void destroy_domain(uint32_t domid)
static void wait_for_domain_deaths(libxl_evgen_domain_death **deathws, int nr)
{
int rc, count = 0;
- LOG("Waiting for %d domains to shutdown", nr);
+ LOG("Waiting for %d domains", nr);
while(1 && count < nr) {
libxl_event *event;
rc = libxl_event_wait(ctx, &event, LIBXL_EVENTMASK_ALL, 0,0);
@@ -2776,15 +2776,15 @@ static void shutdown_domain(uint32_t domid,
fprintf(stderr,"wait for death failed (evgen, rc=%d)\n",rc);
exit(-1);
}
- printf("Waiting for domain %d death %p %"PRIx64"\n",
- domid, *deathw, for_user);
}
}
-static void reboot_domain(uint32_t domid, int fallback_trigger)
+static void reboot_domain(uint32_t domid, libxl_evgen_domain_death **deathw,
+ libxl_ev_user for_user, int fallback_trigger)
{
int rc;
+ fprintf(stderr, "Rebooting domain %d\n", domid);
rc=libxl_domain_reboot(ctx, domid);
if (rc == ERROR_NOPARAVIRT) {
if (fallback_trigger) {
@@ -2800,6 +2800,14 @@ static void reboot_domain(uint32_t domid, int fallback_trigger)
if (rc) {
fprintf(stderr,"reboot failed (rc=%d)\n",rc);exit(-1);
}
+
+ if (deathw) {
+ rc = libxl_evenable_domain_death(ctx, domid, for_user, deathw);
+ if (rc) {
+ fprintf(stderr,"wait for death failed (evgen, rc=%d)\n",rc);
+ exit(-1);
+ }
+ }
}
static void list_domains_details(const libxl_dominfo *info, int nb_domain)
@@ -3713,8 +3721,11 @@ int main_destroy(int argc, char **argv)
return 0;
}
-int main_shutdown(int argc, char **argv)
+static int main_shutdown_or_reboot(int reboot, int argc, char **argv)
{
+ void (*fn)(uint32_t domid,
+ libxl_evgen_domain_death **, libxl_ev_user, int) =
+ reboot ? &reboot_domain : &shutdown_domain;
int opt, i, nb_domain;
int wait_for_it = 0, all =0;
int fallback_trigger = 0;
@@ -3730,6 +3741,7 @@ int main_shutdown(int argc, char **argv)
return opt;
case 'a':
all = 1;
+ break;
case 'w':
wait_for_it = 1;
break;
@@ -3758,9 +3770,8 @@ int main_shutdown(int argc, char **argv)
for (i = 0; i<nb_domain; i++) {
if (dominfo[i].domid == 0)
continue;
- shutdown_domain(dominfo[i].domid,
- deathws ? &deathws[i] : NULL, i,
- fallback_trigger);
+ fn(dominfo[i].domid, deathws ? &deathws[i] : NULL, i,
+ fallback_trigger);
}
wait_for_domain_deaths(deathws, nb_domain - 1 /* not dom 0 */);
@@ -3769,8 +3780,7 @@ int main_shutdown(int argc, char **argv)
libxl_evgen_domain_death *deathw = NULL;
uint32_t domid = find_domain(argv[optind]);
- shutdown_domain(domid, wait_for_it ? &deathw : NULL, 0,
- fallback_trigger);
+ fn(domid, wait_for_it ? &deathw : NULL, 0, fallback_trigger);
if (wait_for_it)
wait_for_domain_deaths(&deathw, 1);
@@ -3780,23 +3790,14 @@ int main_shutdown(int argc, char **argv)
return 0;
}
-int main_reboot(int argc, char **argv)
+int main_shutdown(int argc, char **argv)
{
- int opt;
- int fallback_trigger = 0;
-
- while ((opt = def_getopt(argc, argv, "F", "reboot", 1)) != -1) {
- switch (opt) {
- case 0: case 2:
- return opt;
- case 'F':
- fallback_trigger = 1;
- break;
- }
- }
+ return main_shutdown_or_reboot(0, argc, argv);
+}
- reboot_domain(find_domain(argv[optind]), fallback_trigger);
- return 0;
+int main_reboot(int argc, char **argv)
+{
+ return main_shutdown_or_reboot(1, argc, argv);
}
int main_list(int argc, char **argv)
diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c
index fde7fe3707..d3a215d247 100644
--- a/tools/libxl/xl_cmdtable.c
+++ b/tools/libxl/xl_cmdtable.c
@@ -70,10 +70,12 @@ struct cmd_spec cmd_table[] = {
{ "reboot",
&main_reboot, 0, 1,
"Issue a reboot signal to a domain",
- "[options] <Domain>",
+ "[options] <-a|Domain>",
+ "-a, --all Shutdown all guest domains.\n"
"-h Print this help.\n"
"-F Fallback to ACPI reset event for HVM guests with\n"
" no PV drivers.\n"
+ "-w, --wait Wait for guest(s) to reboot.\n"
},
{ "pci-attach",
&main_pciattach, 0, 1,