From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sander Eikelenboom Subject: [PATCH 2 of 3] xl: Introduce reboot xm compatibility option -a and -w Date: Thu, 06 Sep 2012 21:41:28 +0200 Message-ID: <780eae92908a911f63f7.1346960488@xentest.example.org> References: Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xensource.com Cc: Ian.Campbell@citrix.com List-Id: xen-devel@lists.xenproject.org * Add missing option -a to reboot all guest domains * Add missing option -w to wait for the domain to reboot before returning Signed-off-by: Sander Eikelenboom 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 [I] I +=item B [I] I<-a|domain-id> Reboot a domain. This acts just as if the domain had the B command run from the console. The command returns as soon as it has @@ -452,6 +452,12 @@ B =over 4 +-a Shutdown all guest domains. Often used when doing a complete shutdown of a Xen system. + +=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", + "[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,