|
[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 |