Vincent Hanquez wrote:
On 12/05/10 16:57, Gihan Munasinghe wrote:
The sleep is still needed, if not libxl_* calls fails sometimes. I'll do
more debugging with in the calls it self and see, but for now the
sleep() seems to do the trick.
diff -Naur libxl/libxl.c libxl-patch/libxl.c
--- libxl/libxl.c 2010-05-11 09:37:50.000000000 +0100
+++ libxl-patch/libxl.c 2010-05-12 16:24:42.000000000 +0100
@@ -538,12 +538,12 @@
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 (/* hvm */ 1) {
unsigned long acpi_s_state = 0;
unsigned long pvdriver = 0;
you can't just switch from 0 to 1, otherwise pv domains will just
fails (although i see we're not testing xc_get_hvm_param return values
either).
I though PV domain would have been captured by..
xc_get_hvm_param(ctx->xch, domid, HVM_PARAM_CALLBACK_IRQ, &pvdriver);
if (!pvdriver .. )
the if (/* hvm */ 0) is because the function never properly tested if
the domain is hvm or not. nowadays you have is_hvm(domid) function
that can handily replace the hardcoded value.
Yes having is_hvm is much better than the hard coded values I have
changed that bit of code see attached patch.
I tested with hvm with and with out pv drivers. seems to work. Would be
appreciate if someone can test in full pv domains.
Thanks
--
Gihan
diff -Naur libxl/libxl.c libxl-patch/libxl.c
--- libxl/libxl.c 2010-05-11 09:37:50.000000000 +0100
+++ libxl-patch/libxl.c 2010-05-12 17:43:51.000000000 +0100
@@ -538,12 +538,12 @@
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;
diff -Naur libxl/xl_cmdimpl.c libxl-patch/xl_cmdimpl.c
--- libxl/xl_cmdimpl.c 2010-05-11 09:37:50.000000000 +0100
+++ libxl-patch/xl_cmdimpl.c 2010-05-12 16:46:12.000000000 +0100
@@ -1129,6 +1129,7 @@
free(w1);
free(w2);
LOG("Done. Rebooting now");
+ sleep(2);/*Fix Me: If this sleep is not there the
domain creation failes sometimes*/
goto start;
}
LOG("Done. Exiting now");
@@ -1226,6 +1227,12 @@
} else if(!strcmp(command, "destroy")) {
printf("Usage: xl destroy <Domain>\n\n");
printf("Terminate a domain immediately.\n\n");
+ } else if(!strcmp(command, "shutdown")) {
+ printf("Usage: xl shutdown <Domain>\n\n");
+ printf("issue a shutdown signal to a domain.\n\n");
+ } else if(!strcmp(command, "reboot")) {
+ printf("Usage: xl reboot <Domain>\n\n");
+ printf("issue a reboot signal to a domain.\n\n");
} else if (!strcmp(command, "console")) {
printf("Usage: xl console <Domain>\n\n");
printf("Attach to domain's console.\n\n");
@@ -1591,6 +1598,23 @@
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;
@@ -2340,6 +2364,59 @@
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;
diff -Naur libxl/xl_cmdimpl.h libxl-patch/xl_cmdimpl.h
--- libxl/xl_cmdimpl.h 2010-05-11 09:37:50.000000000 +0100
+++ libxl-patch/xl_cmdimpl.h 2010-05-11 12:51:14.000000000 +0100
@@ -27,6 +27,8 @@
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);
diff -Naur libxl/xl_cmdtable.c libxl-patch/xl_cmdtable.c
--- libxl/xl_cmdtable.c 2010-05-11 09:37:50.000000000 +0100
+++ libxl-patch/xl_cmdtable.c 2010-05-11 13:28:31.000000000 +0100
@@ -18,6 +18,8 @@
{ "create", &main_create, "create a domain from config file <filename>" },
{ "list", &main_list, "list information about all domains" },
{ "destroy", &main_destroy, "terminate a domain immediately" },
+ { "shutdown", &main_shutdown, "issue a shutdown signal to a domain" },
+ { "reboot", &main_reboot, "issue a reboot signal to a domain " },
{ "pci-attach", &main_pciattach, "insert a new pass-through pci device" },
{ "pci-detach", &main_pcidetach, "remove a domain's pass-through pci
device" },
{ "pci-list", &main_pcilist, "list pass-through pci devices for a domain"
},
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|