* [PATCH 1 of 3 V2] libxl: add libxl__domain_pvcontrol_{available, read, write}
2011-12-16 9:51 [PATCH 0 of 3 V2] libxl: domain shutdown cleanup Ian Campbell
@ 2011-12-16 9:51 ` Ian Campbell
2011-12-16 9:51 ` [PATCH 2 of 3 V2] libxl: split libxl_domain_shutdown into libxl_domain_shutdown & libxl_domain_reboot Ian Campbell
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Ian Campbell @ 2011-12-16 9:51 UTC (permalink / raw)
To: xen-devel; +Cc: ian.jackson
# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1324028086 0
# Node ID 38902f8c4ef37b841e1ec93b740108e0767aada4
# Parent 511748da941c0d87f56e56ff05abfe860bd37689
libxl: add libxl__domain_pvcontrol_{available,read,write}
Use instead of open coding.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
diff -r 511748da941c -r 38902f8c4ef3 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c Fri Dec 16 09:34:43 2011 +0000
+++ b/tools/libxl/libxl.c Fri Dec 16 09:34:46 2011 +0000
@@ -542,6 +542,58 @@ int libxl_domain_unpause(libxl_ctx *ctx,
return rc;
}
+int libxl__domain_pvcontrol_available(libxl__gc *gc, uint32_t domid)
+{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
+
+ unsigned long pvdriver = 0;
+ int ret;
+
+ if (LIBXL__DOMAIN_IS_TYPE(gc, domid, PV))
+ return 1;
+
+ ret = xc_get_hvm_param(ctx->xch, domid, HVM_PARAM_CALLBACK_IRQ, &pvdriver);
+ if (ret<0) {
+ LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting HVM callback IRQ");
+ return ERROR_FAIL;
+ }
+ return !!pvdriver;
+}
+
+char * libxl__domain_pvcontrol_read(libxl__gc *gc, xs_transaction_t t,
+ uint32_t domid)
+{
+ const char *shutdown_path;
+ const char *dom_path;
+
+ dom_path = libxl__xs_get_dompath(gc, domid);
+ if (!dom_path)
+ return NULL;
+
+ shutdown_path = libxl__sprintf(gc, "%s/control/shutdown", dom_path);
+ if (!shutdown_path)
+ return NULL;
+
+ return libxl__xs_read(gc, t, shutdown_path);
+}
+
+int libxl__domain_pvcontrol_write(libxl__gc *gc, xs_transaction_t t,
+ uint32_t domid, const char *cmd)
+{
+ const char *shutdown_path;
+ const char *dom_path;
+
+ dom_path = libxl__xs_get_dompath(gc, domid);
+ if (!dom_path)
+ return ERROR_FAIL;
+
+ shutdown_path = libxl__sprintf(gc, "%s/control/shutdown", dom_path);
+ if (!shutdown_path)
+ return ERROR_FAIL;
+
+ return libxl__xs_write(gc, t, shutdown_path, "%s", cmd);
+}
+
static char *req_table[] = {
[0] = "poweroff",
[1] = "reboot",
@@ -553,42 +605,29 @@ static char *req_table[] = {
int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid, int req)
{
GC_INIT(ctx);
- char *shutdown_path;
- char *dom_path;
+ int ret;
if (req > ARRAY_SIZE(req_table)) {
GC_FREE;
return ERROR_INVAL;
}
- dom_path = libxl__xs_get_dompath(gc, domid);
- if (!dom_path) {
- GC_FREE;
- return ERROR_FAIL;
+ ret = libxl__domain_pvcontrol_available(gc, domid);
+ if (ret < 0)
+ goto out;
+
+ if (!ret) {
+ LIBXL__LOG(CTX, LIBXL__LOG_ERROR, "PV shutdown control not available:"
+ " graceful shutdown not possible, use destroy");
+ ret = ERROR_FAIL;
+ goto out;
}
- if (LIBXL__DOMAIN_IS_TYPE(gc, domid, HVM)) {
- unsigned long pvdriver = 0;
- int ret;
- ret = xc_get_hvm_param(ctx->xch, domid, HVM_PARAM_CALLBACK_IRQ, &pvdriver);
- if (ret<0) {
- LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting HVM callback IRQ");
- GC_FREE;
- return ERROR_FAIL;
- }
- if (!pvdriver) {
- LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "HVM domain without PV drivers:"
- " graceful shutdown not possible, use destroy");
- GC_FREE;
- return ERROR_FAIL;
- }
- }
-
- shutdown_path = libxl__sprintf(gc, "%s/control/shutdown", dom_path);
- xs_write(ctx->xsh, XBT_NULL, shutdown_path, req_table[req], strlen(req_table[req]));
-
+ ret = libxl__domain_pvcontrol_write(gc, XBT_NULL, domid, req_table[req]);
+
+out:
GC_FREE;
- return 0;
+ return ret;
}
int libxl_get_wait_fd(libxl_ctx *ctx, int *fd)
diff -r 511748da941c -r 38902f8c4ef3 tools/libxl/libxl_dom.c
--- a/tools/libxl/libxl_dom.c Fri Dec 16 09:34:43 2011 +0000
+++ b/tools/libxl/libxl_dom.c Fri Dec 16 09:34:46 2011 +0000
@@ -415,7 +415,7 @@ static int libxl__domain_suspend_common_
struct suspendinfo *si = data;
unsigned long hvm_s_state = 0, hvm_pvdrv = 0;
int ret;
- char *path, *state = "suspend";
+ char *state = "suspend";
int watchdog;
libxl_ctx *ctx = libxl__gc_owner(si->gc);
xs_transaction_t t;
@@ -451,15 +451,14 @@ static int libxl__domain_suspend_common_
LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "issuing %s suspend request via XenBus control node",
si->hvm ? "PVHVM" : "PV");
- path = libxl__sprintf(si->gc, "%s/control/shutdown", libxl__xs_get_dompath(si->gc, si->domid));
- libxl__xs_write(si->gc, XBT_NULL, path, "suspend");
+ libxl__domain_pvcontrol_write(si->gc, XBT_NULL, si->domid, "suspend");
LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "wait for the guest to acknowledge suspend request");
watchdog = 60;
while (!strcmp(state, "suspend") && watchdog > 0) {
usleep(100000);
- state = libxl__xs_read(si->gc, XBT_NULL, path);
+ state = libxl__domain_pvcontrol_read(si->gc, XBT_NULL, si->domid);
if (!state) state = "";
watchdog--;
@@ -479,11 +478,11 @@ static int libxl__domain_suspend_common_
retry_transaction:
t = xs_transaction_start(ctx->xsh);
- state = libxl__xs_read(si->gc, t, path);
+ state = libxl__domain_pvcontrol_read(si->gc, t, si->domid);
if (!state) state = "";
if (!strcmp(state, "suspend"))
- libxl__xs_write(si->gc, t, path, "");
+ libxl__domain_pvcontrol_write(si->gc, t, si->domid, "");
if (!xs_transaction_end(ctx->xsh, t, 0))
if (errno == EAGAIN)
diff -r 511748da941c -r 38902f8c4ef3 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h Fri Dec 16 09:34:43 2011 +0000
+++ b/tools/libxl/libxl_internal.h Fri Dec 16 09:34:46 2011 +0000
@@ -247,6 +247,12 @@ _hidden const char *libxl__device_model_
_hidden int libxl__domain_save_device_model(libxl__gc *gc, uint32_t domid, int fd);
_hidden void libxl__userdata_destroyall(libxl__gc *gc, uint32_t domid);
+_hidden int libxl__domain_pvcontrol_available(libxl__gc *gc, uint32_t domid);
+_hidden char * libxl__domain_pvcontrol_read(libxl__gc *gc,
+ xs_transaction_t t, uint32_t domid);
+_hidden int libxl__domain_pvcontrol_write(libxl__gc *gc, xs_transaction_t t,
+ uint32_t domid, const char *cmd);
+
/* from xl_device */
_hidden char *libxl__device_disk_string_of_backend(libxl_disk_backend backend);
_hidden char *libxl__device_disk_string_of_format(libxl_disk_format format);
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH 2 of 3 V2] libxl: split libxl_domain_shutdown into libxl_domain_shutdown & libxl_domain_reboot
2011-12-16 9:51 [PATCH 0 of 3 V2] libxl: domain shutdown cleanup Ian Campbell
2011-12-16 9:51 ` [PATCH 1 of 3 V2] libxl: add libxl__domain_pvcontrol_{available, read, write} Ian Campbell
@ 2011-12-16 9:51 ` Ian Campbell
2011-12-16 9:51 ` [PATCH 3 of 3 V2] libxl: report failure to reboot/shutdown due to lackof PV interfaces to caller Ian Campbell
2011-12-16 9:55 ` [PATCH 0 of 3 V2] libxl: domain shutdown cleanup Ian Campbell
3 siblings, 0 replies; 6+ messages in thread
From: Ian Campbell @ 2011-12-16 9:51 UTC (permalink / raw)
To: xen-devel; +Cc: ian.jackson
# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1324028847 0
# Node ID 381829d0bb2b418a45962821718e824c353ae705
# Parent 38902f8c4ef37b841e1ec93b740108e0767aada4
libxl: split libxl_domain_shutdown into libxl_domain_shutdown & libxl_domain_reboot
The other integer request types which shutdown supported are not useful. Specifically:
* "suspend" is not usable via this interface since it requires other
scaffolding, libxl_domain_suspend provides this already.
* "halt" is the same as "poweroff".
* "crash" is unused and at least Linux does not implement it. If a user
steps forward then libxl_domain_crash is trivial to add.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
diff -r 38902f8c4ef3 -r 381829d0bb2b tools/libxl/libxl.c
--- a/tools/libxl/libxl.c Fri Dec 16 09:34:46 2011 +0000
+++ b/tools/libxl/libxl.c Fri Dec 16 09:47:27 2011 +0000
@@ -594,38 +594,38 @@ int libxl__domain_pvcontrol_write(libxl_
return libxl__xs_write(gc, t, shutdown_path, "%s", cmd);
}
-static char *req_table[] = {
- [0] = "poweroff",
- [1] = "reboot",
- [2] = "suspend",
- [3] = "crash",
- [4] = "halt",
-};
-
-int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid, int req)
+static int libxl__domain_pvcontrol(libxl__gc *gc, uint32_t domid,
+ const char *cmd)
+{
+ int ret;
+
+ ret = libxl__domain_pvcontrol_available(gc, domid);
+ if (ret < 0)
+ return ret;
+
+ if (!ret) {
+ LIBXL__LOG(CTX, LIBXL__LOG_ERROR,
+ "PV control interface not available\n");
+ return ERROR_FAIL;
+ }
+
+ return libxl__domain_pvcontrol_write(gc, XBT_NULL, domid, cmd);
+}
+
+int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid)
{
GC_INIT(ctx);
int ret;
-
- if (req > ARRAY_SIZE(req_table)) {
- GC_FREE;
- return ERROR_INVAL;
- }
-
- ret = libxl__domain_pvcontrol_available(gc, domid);
- if (ret < 0)
- goto out;
-
- if (!ret) {
- LIBXL__LOG(CTX, LIBXL__LOG_ERROR, "PV shutdown control not available:"
- " graceful shutdown not possible, use destroy");
- ret = ERROR_FAIL;
- goto out;
- }
-
- ret = libxl__domain_pvcontrol_write(gc, XBT_NULL, domid, req_table[req]);
-
-out:
+ ret = libxl__domain_pvcontrol(gc, domid, "poweroff");
+ GC_FREE;
+ return ret;
+}
+
+int libxl_domain_reboot(libxl_ctx *ctx, uint32_t domid)
+{
+ GC_INIT(ctx);
+ int ret;
+ ret = libxl__domain_pvcontrol(gc, domid, "reboot");
GC_FREE;
return ret;
}
diff -r 38902f8c4ef3 -r 381829d0bb2b tools/libxl/libxl.h
--- a/tools/libxl/libxl.h Fri Dec 16 09:34:46 2011 +0000
+++ b/tools/libxl/libxl.h Fri Dec 16 09:47:27 2011 +0000
@@ -268,7 +268,8 @@ void libxl_domain_config_dispose(libxl_d
int libxl_domain_suspend(libxl_ctx *ctx, libxl_domain_suspend_info *info,
uint32_t domid, int fd);
int libxl_domain_resume(libxl_ctx *ctx, uint32_t domid);
-int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid, int req);
+int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid);
+int libxl_domain_reboot(libxl_ctx *ctx, uint32_t domid);
int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force);
int libxl_domain_preserve(libxl_ctx *ctx, uint32_t domid, libxl_domain_create_info *info, const char *name_suffix, libxl_uuid new_uuid);
diff -r 38902f8c4ef3 -r 381829d0bb2b tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c Fri Dec 16 09:34:46 2011 +0000
+++ b/tools/libxl/xl_cmdimpl.c Fri Dec 16 09:47:27 2011 +0000
@@ -2265,7 +2265,7 @@ static void shutdown_domain(const char *
int rc;
find_domain(p);
- rc=libxl_domain_shutdown(ctx, domid, 0);
+ rc=libxl_domain_shutdown(ctx, domid);
if (rc) { fprintf(stderr,"shutdown failed (rc=%d)\n",rc);exit(-1); }
if (wait) {
@@ -2307,7 +2307,7 @@ static void reboot_domain(const char *p)
{
int rc;
find_domain(p);
- rc=libxl_domain_shutdown(ctx, domid, 1);
+ rc=libxl_domain_reboot(ctx, domid);
if (rc) { fprintf(stderr,"reboot failed (rc=%d)\n",rc);exit(-1); }
}
diff -r 38902f8c4ef3 -r 381829d0bb2b tools/python/xen/lowlevel/xl/xl.c
--- a/tools/python/xen/lowlevel/xl/xl.c Fri Dec 16 09:34:46 2011 +0000
+++ b/tools/python/xen/lowlevel/xl/xl.c Fri Dec 16 09:47:27 2011 +0000
@@ -424,10 +424,10 @@ static PyObject *pyxl_domid_to_name(XlOb
static PyObject *pyxl_domain_shutdown(XlObject *self, PyObject *args)
{
- int domid, req = 0;
- if ( !PyArg_ParseTuple(args, "i|i", &domid, &req) )
+ int domid;
+ if ( !PyArg_ParseTuple(args, "i", &domid) )
return NULL;
- if ( libxl_domain_shutdown(self->ctx, domid, req) ) {
+ if ( libxl_domain_shutdown(self->ctx, domid) ) {
PyErr_SetString(xl_error_obj, "cannot shutdown domain");
return NULL;
}
@@ -435,6 +435,19 @@ static PyObject *pyxl_domain_shutdown(Xl
return Py_None;
}
+static PyObject *pyxl_domain_reboot(XlObject *self, PyObject *args)
+{
+ int domid;
+ if ( !PyArg_ParseTuple(args, "i", &domid) )
+ return NULL;
+ if ( libxl_domain_reboot(self->ctx, domid) ) {
+ PyErr_SetString(xl_error_obj, "cannot reboot domain");
+ return NULL;
+ }
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
static PyObject *pyxl_domain_destroy(XlObject *self, PyObject *args)
{
int domid, force = 1;
@@ -637,6 +650,8 @@ static PyMethodDef pyxl_methods[] = {
"Retrieve name from domain-id"},
{"domain_shutdown", (PyCFunction)pyxl_domain_shutdown, METH_VARARGS,
"Shutdown a domain"},
+ {"domain_reboot", (PyCFunction)pyxl_domain_reboot, METH_VARARGS,
+ "Reboot a domain"},
{"domain_destroy", (PyCFunction)pyxl_domain_destroy, METH_VARARGS,
"Destroy a domain"},
{"domain_pause", (PyCFunction)pyxl_domain_pause, METH_VARARGS,
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH 3 of 3 V2] libxl: report failure to reboot/shutdown due to lackof PV interfaces to caller
2011-12-16 9:51 [PATCH 0 of 3 V2] libxl: domain shutdown cleanup Ian Campbell
2011-12-16 9:51 ` [PATCH 1 of 3 V2] libxl: add libxl__domain_pvcontrol_{available, read, write} Ian Campbell
2011-12-16 9:51 ` [PATCH 2 of 3 V2] libxl: split libxl_domain_shutdown into libxl_domain_shutdown & libxl_domain_reboot Ian Campbell
@ 2011-12-16 9:51 ` Ian Campbell
2011-12-16 9:55 ` [PATCH 0 of 3 V2] libxl: domain shutdown cleanup Ian Campbell
3 siblings, 0 replies; 6+ messages in thread
From: Ian Campbell @ 2011-12-16 9:51 UTC (permalink / raw)
To: xen-devel; +Cc: ian.jackson
# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1324028886 0
# Node ID 5924514e0523e284ac12f06909d04d7cb35faa73
# Parent 381829d0bb2b418a45962821718e824c353ae705
libxl: report failure to reboot/shutdown due to lackof PV interfaces to caller
This allow the caller to react as they think is appropriate. xl now prints a
message much like the library did previously, although hopefully somewhat more
informative.
Update the xl(1) man page to be similarly more informative.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
diff -r 381829d0bb2b -r 5924514e0523 docs/man/xl.pod.1
--- a/docs/man/xl.pod.1 Fri Dec 16 09:47:27 2011 +0000
+++ b/docs/man/xl.pod.1 Fri Dec 16 09:48:06 2011 +0000
@@ -368,7 +368,11 @@ Reboot a domain. This acts just as if t
command run from the console. The command returns as soon as it has
executed the reboot action, which may be significantly before the
domain actually reboots.
-It requires PV drivers installed in your guest OS.
+
+For HVM domains this requires PV drivers to be installed in your guest
+OS. If PV drivers are not present but you have configured the guest OS
+to behave appropriately you may be able to use the I<button-press>
+subcommand to trigger a power button press.
The behavior of what happens to a domain when it reboots is set by the
B<on_reboot> parameter of the domain configuration file when the
@@ -424,9 +428,15 @@ Leave domain running after creating the
Gracefully shuts down a domain. This coordinates with the domain OS
to perform graceful shutdown, so there is no guarantee that it will
succeed, and may take a variable length of time depending on what
-services must be shutdown in the domain. The command returns
-immediately after signally the domain unless that B<-w> flag is used.
-For HVM domains it requires PV drivers to be installed in your guest OS.
+services must be shutdown in the domain.
+
+For HVM domains this requires PV drivers to be installed in your guest
+OS. If PV drivers are not present but you have configured the guest OS
+to behave appropriately you may be able to use the I<button-press>
+subcommand to trigger a power button press.
+
+The command returns immediately after signally the domain unless that
+B<-w> flag is used.
The behavior of what happens to a domain when it reboots is set by the
B<on_shutdown> parameter of the domain configuration file when the
diff -r 381829d0bb2b -r 5924514e0523 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c Fri Dec 16 09:47:27 2011 +0000
+++ b/tools/libxl/libxl.c Fri Dec 16 09:48:06 2011 +0000
@@ -603,11 +603,8 @@ static int libxl__domain_pvcontrol(libxl
if (ret < 0)
return ret;
- if (!ret) {
- LIBXL__LOG(CTX, LIBXL__LOG_ERROR,
- "PV control interface not available\n");
- return ERROR_FAIL;
- }
+ if (!ret)
+ return ERROR_NOPARAVIRT;
return libxl__domain_pvcontrol_write(gc, XBT_NULL, domid, cmd);
}
diff -r 381829d0bb2b -r 5924514e0523 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h Fri Dec 16 09:47:27 2011 +0000
+++ b/tools/libxl/libxl.h Fri Dec 16 09:48:06 2011 +0000
@@ -222,6 +222,7 @@ enum {
ERROR_BADFAIL = -7,
ERROR_GUEST_TIMEDOUT = -8,
ERROR_TIMEDOUT = -9,
+ ERROR_NOPARAVIRT = -10,
};
#define LIBXL_VERSION 0
diff -r 381829d0bb2b -r 5924514e0523 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c Fri Dec 16 09:47:27 2011 +0000
+++ b/tools/libxl/xl_cmdimpl.c Fri Dec 16 09:48:06 2011 +0000
@@ -2266,7 +2266,15 @@ static void shutdown_domain(const char *
find_domain(p);
rc=libxl_domain_shutdown(ctx, domid);
- if (rc) { fprintf(stderr,"shutdown failed (rc=%d)\n",rc);exit(-1); }
+ if (rc) {
+ if (rc == ERROR_NOPARAVIRT) {
+ fprintf(stderr, "PV control interface not available:"
+ " external graceful shutdown not possible.\n");
+ fprintf(stderr, "Use \"xl button-press <dom> power\" or"
+ " \"xl destroy <dom>\".\n");
+ }
+ fprintf(stderr,"shutdown failed (rc=%d)\n",rc);exit(-1);
+ }
if (wait) {
libxl_waiter waiter;
@@ -2308,7 +2316,14 @@ static void reboot_domain(const char *p)
int rc;
find_domain(p);
rc=libxl_domain_reboot(ctx, domid);
- if (rc) { fprintf(stderr,"reboot failed (rc=%d)\n",rc);exit(-1); }
+ if (rc) {
+ if (rc == ERROR_NOPARAVIRT) {
+ fprintf(stderr, "PV control interface not available:"
+ " external graceful reboot not possible.\n");
+ fprintf(stderr, "Use \"xl button-press <dom> power\" or"
+ " \"xl destroy <dom>\".\n");
+ }
+ fprintf(stderr,"reboot failed (rc=%d)\n",rc);exit(-1); }
}
static void list_domains_details(const libxl_dominfo *info, int nb_domain)
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH 0 of 3 V2] libxl: domain shutdown cleanup
2011-12-16 9:51 [PATCH 0 of 3 V2] libxl: domain shutdown cleanup Ian Campbell
` (2 preceding siblings ...)
2011-12-16 9:51 ` [PATCH 3 of 3 V2] libxl: report failure to reboot/shutdown due to lackof PV interfaces to caller Ian Campbell
@ 2011-12-16 9:55 ` Ian Campbell
2011-12-20 18:18 ` Ian Jackson
3 siblings, 1 reply; 6+ messages in thread
From: Ian Campbell @ 2011-12-16 9:55 UTC (permalink / raw)
To: xen-devel@lists.xensource.com; +Cc: Ian Jackson
On Fri, 2011-12-16 at 09:51 +0000, Ian Campbell wrote:
> The existing libxl_domain_shutdown is a bit odd, it takes an integer
> "req" which can be used to indicate one of:
> * [0] = "poweroff",
> * [1] = "reboot",
> * [2] = "suspend",
> * [3] = "crash",
> * [4] = "halt",
>
> "suspend" is not usable via this interface since it requires other
> scaffolding, libxl_domain_suspend provides this already.
>
> "halt" is the same as "poweroff".
>
> "crash" is unused and at least Linux does not implement it. If a user
> steps forward then libxl_domain_crash is trivial to add.
>
> Therefore split libxl_domain_shutdown into libxl_domain_shutdown and
> libxl_domain_reboot corresponding to "poweroff" and "reboot"
> respectively.
>
> Also push responsibility for dealing with lack of PV drivers into the
> caller and at the same time improve the error messages presented to
> the user when they try and "xl shutdown/reboot" an HVM guest with no
> PV drivers and the corresponding documentation.
Forgot to save before hg email, should have said:
Changes since last time:
- Remove massive redundancy in libxl_domain_{shutdown,reboot}
Ian.
^ permalink raw reply [flat|nested] 6+ messages in thread