[libvirt] [PATCH] Add domainCoreDump to libxl driver
Jim Fehlig
jfehlig at novell.com
Thu May 26 21:31:28 UTC 2011
Markus Groß wrote:
> For core dumping to work correctly the following patch
> for xen is needed:
> http://lists.xensource.com/archives/html/xen-devel/2011-05/msg01469.html
>
> This patch is in xen-unstable and is considered for backport to
> the xen stable branches. Without this patch the mapped
> memory pages of the pv guest are not unmapped after core-dump.
>
> ---
> src/libxl/libxl_driver.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 87 insertions(+), 0 deletions(-)
>
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index b2cc0e8..75008db 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -1627,6 +1627,92 @@ libxlDomainGetState(virDomainPtr dom,
> }
>
> static int
> +libxlDomainCoreDump(virDomainPtr dom, const char *to, int flags)
> +{
> + libxlDriverPrivatePtr driver = dom->conn->privateData;
> + libxlDomainObjPrivatePtr priv;
> + virDomainObjPtr vm;
> + virDomainEventPtr event = NULL;
> + int paused = 0;
> + int ret = -1;
> +
> + virCheckFlags(VIR_DUMP_LIVE | VIR_DUMP_CRASH, -1);
> +
> + libxlDriverLock(driver);
> + vm = virDomainFindByUUID(&driver->domains, dom->uuid);
> +
> + if (!vm) {
> + char uuidstr[VIR_UUID_STRING_BUFLEN];
> + virUUIDFormat(dom->uuid, uuidstr);
> + libxlError(VIR_ERR_NO_DOMAIN,
> + _("No domain with matching uuid '%s'"), uuidstr);
> + goto cleanup;
> + }
> +
> + if (!virDomainObjIsActive(vm)) {
> + libxlError(VIR_ERR_OPERATION_INVALID, "%s", _("Domain is not running"));
> + goto cleanup;
> + }
> +
> + priv = vm->privateData;
> +
> + if (!(flags & VIR_DUMP_LIVE) &&
> + virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
> + if (libxl_domain_pause(&priv->ctx, dom->id) != 0) {
> + libxlError(VIR_ERR_INTERNAL_ERROR,
> + _("Failed to suspend domain '%d' with libxenlight"),
> + dom->id);
>
I think there could be a little more info in that error message, e.g.
"Before dumping core, failed to suspend ...".
> + goto cleanup;
> + }
> + virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, VIR_DOMAIN_PAUSED_DUMP);
> + paused = 1;
> + }
> +
> + if (libxl_domain_core_dump(&priv->ctx, dom->id, to) != 0) {
> + libxlError(VIR_ERR_INTERNAL_ERROR,
> + _("Failed to dump core of domain '%d' with libxenlight"),
> + dom->id);
> + goto cleanup;
> + }
>
If core dumping fails and the domain was paused, it won't be unpaused by
jumping to cleanup.
> +
> + if (flags & VIR_DUMP_CRASH) {
> + if (libxlVmReap(driver, vm, 1, VIR_DOMAIN_SHUTOFF_CRASHED) != 0) {
> + libxlError(VIR_ERR_INTERNAL_ERROR,
> + _("Failed to destroy domain '%d'"), dom->id);
> + goto cleanup;
> + }
> +
> + event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
> + VIR_DOMAIN_EVENT_STOPPED_CRASHED);
> +
> + } else if (paused) {
> + if (libxl_domain_unpause(&priv->ctx, dom->id) != 0) {
> + libxlError(VIR_ERR_INTERNAL_ERROR,
> + _("Failed to resume domain '%d' with libxenlight"),
> + dom->id);
>
Here too more info in the error message, e.g. "After dumping core,
failed to resume ..."
> + goto cleanup;
> + }
> + virDomainObjSetState(vm, VIR_DOMAIN_RUNNING,
> + VIR_DOMAIN_RUNNING_UNPAUSED);
> + }
> +
> + if ((flags & VIR_DUMP_CRASH) && !vm->persistent) {
> + virDomainRemoveInactive(&driver->domains, vm);
> + vm = NULL;
> + }
> +
> + ret = 0;
> +
> +cleanup:
> + if (vm)
> + virDomainObjUnlock(vm);
> + if (event)
> + libxlDomainEventQueue(driver, event);
> + libxlDriverUnlock(driver);
>
Do we need to have the driver locked during the core dump? Most of the
driver functions use this pattern
libxlDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
libxlDriverUnlock(driver);
Regards,
Jim
> + return ret;
> +}
> +
> +static int
> libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
> unsigned int flags)
> {
> @@ -2722,6 +2808,7 @@ static virDriver libxlDriver = {
> .domainSetMemoryFlags = libxlDomainSetMemoryFlags, /* 0.9.0 */
> .domainGetInfo = libxlDomainGetInfo, /* 0.9.0 */
> .domainGetState = libxlDomainGetState, /* 0.9.2 */
> + .domainCoreDump = libxlDomainCoreDump, /* 0.9.2 */
> .domainSetVcpus = libxlDomainSetVcpus, /* 0.9.0 */
> .domainSetVcpusFlags = libxlDomainSetVcpusFlags, /* 0.9.0 */
> .domainGetVcpusFlags = libxlDomainGetVcpusFlags, /* 0.9.0 */
>
More information about the libvir-list
mailing list