]> xenbits.xensource.com Git - xen.git/commitdiff
xl: adds shutdown and reboot commands
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 2 Jun 2010 09:52:17 +0000 (10:52 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 2 Jun 2010 09:52:17 +0000 (10:52 +0100)
libxl : remote shutdown to work for pure hvm domains

Signed-off-by: Gihan Munasinghe <GMunasinghe@flexiant.com>
tools/libxl/libxl.c
tools/libxl/xl.h
tools/libxl/xl_cmdimpl.c
tools/libxl/xl_cmdtable.c

index d7563b4b31af2122dfc782e50440ee13b6b71b8e..c6580ce0a6a19df4d932502ea53a8394856c0889 100644 (file)
@@ -550,12 +550,12 @@ int libxl_domain_shutdown(struct libxl_ctx *ctx, uint32_t domid, int req)
     shutdown_path = libxl_sprintf(ctx, "%s/control/shutdown", dom_path);
 
     xs_write(ctx->xsh, XBT_NULL, shutdown_path, req_table[req], strlen(req_table[req]));
-    if (/* hvm */ 0) {
+    if (is_hvm(ctx,domid)) {
         unsigned long acpi_s_state = 0;
         unsigned long pvdriver = 0;
         xc_get_hvm_param(ctx->xch, domid, HVM_PARAM_ACPI_S_STATE, &acpi_s_state);
         xc_get_hvm_param(ctx->xch, domid, HVM_PARAM_CALLBACK_IRQ, &pvdriver);
-        if (!pvdriver && acpi_s_state != 0)
+        if (!pvdriver || acpi_s_state != 0)
             xc_domain_shutdown(ctx->xch, domid, req);
     }
     return 0;
index 3144a64e0db2d6f32867e7936177415993e4d34f..6ad08f64955271c579e65af282081bcc3a4138d0 100644 (file)
@@ -40,6 +40,8 @@ int main_migrate(int argc, char **argv);
 int main_pause(int argc, char **argv);
 int main_unpause(int argc, char **argv);
 int main_destroy(int argc, char **argv);
+int main_shutdown(int argc, char **argv);
+int main_reboot(int argc, char **argv);
 int main_list(int argc, char **argv);
 int main_list_vm(int argc, char **argv);
 int main_create(int argc, char **argv);
index 476ec78eeddd22cd397976caafa4d39388fa8ebd..03eafbf45e8ebd6271f929af0f8bc91d55fe2934 100644 (file)
@@ -1160,6 +1160,11 @@ start:
                             free(w1);
                             free(w2);
                             LOG("Done. Rebooting now");
+                            /*
+                             * XXX FIXME: If this sleep is not there then
+                             * domain re-creation fails sometimes.
+                             */
+                            sleep(2);
                             goto start;
                         }
                         LOG("Done. Exiting now");
@@ -1623,6 +1628,22 @@ void destroy_domain(char *p)
     if (rc) { fprintf(stderr,"destroy failed (rc=%d)\n.",rc); exit(-1); }
 }
 
+void shutdown_domain(char *p)
+{
+    int rc;
+    find_domain(p);
+    rc=libxl_domain_shutdown(&ctx, domid, 0);
+    if (rc) { fprintf(stderr,"shutdown failed (rc=%d)\n.",rc);exit(-1); }
+}
+
+void reboot_domain(char *p)
+{
+    int rc;
+    find_domain(p);
+    rc=libxl_domain_shutdown(&ctx, domid, 1);
+    if (rc) { fprintf(stderr,"reboot failed (rc=%d)\n.",rc);exit(-1); }
+}
+
 void list_domains(int verbose)
 {
     struct libxl_dominfo *info;
@@ -2375,6 +2396,57 @@ int main_destroy(int argc, char **argv)
     exit(0);
 }
 
+int main_shutdown(int argc, char **argv)
+{
+    int opt;
+    char *p;
+
+    while ((opt = getopt(argc, argv, "h")) != -1) {
+        switch (opt) {
+        case 'h':
+            help("shutdown");
+            exit(0);
+        default:
+            fprintf(stderr, "option not supported\n");
+            break;
+        }
+    }
+    if (optind >= argc) {
+        help("shutdown");
+        exit(2);
+    }
+
+    p = argv[optind];
+
+    shutdown_domain(p);
+    exit(0);
+}
+
+int main_reboot(int argc, char **argv)
+{
+    int opt;
+    char *p;
+
+    while ((opt = getopt(argc, argv, "h")) != -1) {
+        switch (opt) {
+        case 'h':
+            help("reboot");
+            exit(0);
+        default:
+            fprintf(stderr, "option not supported\n");
+            break;
+        }
+    }
+    if (optind >= argc) {
+        help("reboot");
+        exit(2);
+    }
+
+    p = argv[optind];
+
+    reboot_domain(p);
+    exit(0);
+}
 int main_list(int argc, char **argv)
 {
     int opt, verbose = 0;
index accc4f929bce6adc488f6fb4272963a57f8c972c..2ea0e66a94f8fa71a32c00eef7e3813632e5c9b5 100644 (file)
@@ -35,6 +35,16 @@ struct cmd_spec cmd_table[] = {
       "Terminate a domain immediately",
       "<Domain>",
     },
+    { "shutdown",
+      &main_shutdown,
+      "Issue a shutdown signal to a domain",
+      "<Domain>",
+    },
+    { "reboot",
+      &main_reboot,
+      "Issue a reboot signal to a domain",
+      "<Domain>",
+    }, 
     { "pci-attach",
       &main_pciattach,
       "Insert a new pass-through pci device",