[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2 of 3] xl: Introduce reboot xm compatibility option -a and -w
On Thu, 2012-09-06 at 20:41 +0100, Sander Eikelenboom wrote: > * Add missing option -a to reboot all guest domains > * Add missing option -w to wait for the domain to reboot before returning If, as I suspect, the code to do this waiting is a cut-and-paste of the same code in the shutdown case please can you refactor it into domain_wait_shutdown and call it from both places. > > > Signed-off-by: Sander Eikelenboom <linux@xxxxxxxxxxxxxx> > > diff -r 4c3d49787cea -r 780eae92908a docs/man/xl.pod.1 > --- a/docs/man/xl.pod.1 Thu Sep 06 21:36:14 2012 +0200 > +++ b/docs/man/xl.pod.1 Thu Sep 06 21:36:41 2012 +0200 > @@ -432,7 +432,7 @@ Pause a domain. When in a paused state > allocated resources such as memory, but will not be eligible for > scheduling by the Xen hypervisor. > > -=item B<reboot> [I<OPTIONS>] I<domain-id> > +=item B<reboot> [I<OPTIONS>] I<-a|domain-id> > > Reboot a domain. This acts just as if the domain had the B<reboot> > command run from the console. The command returns as soon as it has > @@ -452,6 +452,12 @@ B<OPTIONS> > > =over 4 > > +-a Shutdown all guest domains. Often used when doing a complete shutdown > of a Xen system. Please can you wrap to < 80 columns. (and in patch 1/3 and your commit messages too) Thanks, Ian. > + > +=item B<-w> > + > +Wait for the domain to complete shutdown before returning. > + > =item B<-F> > > If the guest does not support PV reboot control then fallback to > diff -r 4c3d49787cea -r 780eae92908a tools/libxl/xl_cmdimpl.c > --- a/tools/libxl/xl_cmdimpl.c Thu Sep 06 21:36:14 2012 +0200 > +++ b/tools/libxl/xl_cmdimpl.c Thu Sep 06 21:36:41 2012 +0200 > @@ -2743,11 +2743,14 @@ static void shutdown_domain(uint32_t dom > } > } > > -static void reboot_domain(const char *p, int fallback_trigger) > +static void reboot_domain(uint32_t domain_id, int wait, int fallback_trigger) > { > int rc; > - find_domain(p); > - rc=libxl_domain_reboot(ctx, domid); > + libxl_event *event; > + > + domid = domain_id; > + rc = libxl_domain_reboot(ctx, domid); > + > if (rc == ERROR_NOPARAVIRT) { > if (fallback_trigger) { > fprintf(stderr, "PV control interface not available:" > @@ -2762,6 +2765,42 @@ static void reboot_domain(const char *p, > if (rc) { > fprintf(stderr,"reboot failed (rc=%d)\n",rc);exit(-1); > } > + > + if (wait) { > + libxl_evgen_domain_death *deathw; > + > + rc = libxl_evenable_domain_death(ctx, domid, 0, &deathw); > + if (rc) { > + fprintf(stderr,"wait for death failed (evgen, rc=%d)\n",rc); > + exit(-1); > + } > + > + for (;;) { > + rc = domain_wait_event(&event); > + if (rc) exit(-1); > + > + switch (event->type) { > + > + case LIBXL_EVENT_TYPE_DOMAIN_DEATH: > + LOG("Domain %d has been destroyed", domid); > + goto done; > + > + case LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN: > + LOG("Domain %d has been shut down, reason code %d %x", domid, > + event->u.domain_shutdown.shutdown_reason, > + event->u.domain_shutdown.shutdown_reason); > + goto done; > + > + default: > + LOG("Unexpected event type %d", event->type); > + break; > + } > + libxl_event_free(ctx, event); > + } > + done: > + libxl_event_free(ctx, event); > + libxl_evdisable_domain_death(ctx, deathw); > + } > } > > static void list_domains_details(const libxl_dominfo *info, int nb_domain) > @@ -3722,20 +3761,52 @@ int main_shutdown(int argc, char **argv) > > int main_reboot(int argc, char **argv) > { > - int opt; > + libxl_dominfo *dominfo; > + int opt, i, nb_domain; > + int all = 0; > + int wait = 0; > int fallback_trigger = 0; > > - while ((opt = def_getopt(argc, argv, "F", "reboot", 1)) != -1) { > + while ((opt = def_getopt(argc, argv, "awF", "reboot", 0)) != -1) { > switch (opt) { > case 0: case 2: > return opt; > + case 'a': > + all = 1; > + break; > + case 'w': > + wait = 1; > + break; > case 'F': > fallback_trigger = 1; > break; > } > } > > - reboot_domain(argv[optind], fallback_trigger); > + if (!argv[optind] && !all) { > + fprintf(stderr, "You must specify -a or a domain id.\n\n"); > + return opt; > + } > + > + if (all) { > + if (!(dominfo = libxl_list_domain(ctx, &nb_domain))) { > + fprintf(stderr, "libxl_list_domain failed.\n"); > + return -1; > + } > + > + for (i = 0; i<nb_domain; i++) { > + if (dominfo[i].domid == 0) > + continue; > + > + reboot_domain(dominfo[i].domid, wait, fallback_trigger); > + } > + > + libxl_dominfo_list_free(dominfo, nb_domain); > + } else { > + find_domain(argv[optind]); > + reboot_domain(domid, wait, fallback_trigger); > + } > + > return 0; > } > > diff -r 4c3d49787cea -r 780eae92908a tools/libxl/xl_cmdtable.c > --- a/tools/libxl/xl_cmdtable.c Thu Sep 06 21:36:14 2012 +0200 > +++ b/tools/libxl/xl_cmdtable.c Thu Sep 06 21:36:41 2012 +0200 > @@ -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 Reboot 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 for guest to reboot.\n" > }, > { "pci-attach", > &main_pciattach, 0, 1, _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |