From 368042cf4a6bca34c7da45517a6e3ce91876c53c Mon Sep 17 00:00:00 2001 From: Anthony PERARD Date: Thu, 15 Jan 2015 16:40:19 +0000 Subject: [PATCH] libxl: Set path to console on domain startup. The path to the pty of a Xen PV console is set only in virDomainOpenConsole. But this is done too late. A call to virDomainGetXMLDesc done before OpenConsole will not have the path to the pty, but a call after OpenConsole will. e.g. of the current issue. Starting a domain with '' Then: virDomainGetXMLDesc(): virDomainOpenConsole() virDomainGetXMLDesc(): The patch intend to have the TTY path on the first call of GetXMLDesc. This is done by setting up the path at domain start up instead of in OpenConsole. https://bugzilla.redhat.com/show_bug.cgi?id=1170743 Signed-off-by: Anthony PERARD --- src/libxl/libxl_domain.c | 47 +++++++++++++++++++++++++++++++++++++--- src/libxl/libxl_driver.c | 15 ------------- 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 91851172ae..856cfb4030 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -1149,6 +1149,42 @@ libxlDomainFreeMem(libxlDomainObjPrivatePtr priv, libxl_domain_config *d_config) return ret; } +static void +libxlConsoleCallback(libxl_ctx *ctx, libxl_event* ev, void *for_callback) +{ + virDomainObjPtr vm = for_callback; + libxlDomainObjPrivatePtr priv = vm->privateData; + size_t i; + + virObjectLock(vm); + for (i = 0; i < vm->def->nconsoles; i++) { + virDomainChrDefPtr chr = vm->def->consoles[i]; + if (chr && chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) { + libxl_console_type console_type; + char *console = NULL; + int ret; + + console_type = + (chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL ? + LIBXL_CONSOLE_TYPE_SERIAL : LIBXL_CONSOLE_TYPE_PV); + ret = libxl_console_get_tty(priv->ctx, ev->domid, + chr->target.port, console_type, + &console); + if (!ret) { + VIR_FREE(chr->source.data.file.path); + if (console && console[0] != '\0') { + ignore_value(VIR_STRDUP(chr->source.data.file.path, + console)); + } + } + VIR_FREE(console); + } + } + virObjectUnlock(vm); + libxl_event_free(ctx, ev); +} + + /* * Start a domain through libxenlight. * @@ -1173,6 +1209,7 @@ libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, libxl_domain_restore_params params; #endif virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr; + libxl_asyncprogress_how aop_console_how; libxl_domain_config_init(&d_config); @@ -1242,17 +1279,21 @@ libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, /* Unlock virDomainObj while creating the domain */ virObjectUnlock(vm); + + aop_console_how.for_callback = vm; + aop_console_how.callback = libxlConsoleCallback; if (restore_fd < 0) { ret = libxl_domain_create_new(priv->ctx, &d_config, - &domid, NULL, NULL); + &domid, NULL, &aop_console_how); } else { #ifdef LIBXL_HAVE_DOMAIN_CREATE_RESTORE_PARAMS params.checkpointed_stream = 0; ret = libxl_domain_create_restore(priv->ctx, &d_config, &domid, - restore_fd, ¶ms, NULL, NULL); + restore_fd, ¶ms, NULL, + &aop_console_how); #else ret = libxl_domain_create_restore(priv->ctx, &d_config, &domid, - restore_fd, NULL, NULL); + restore_fd, NULL, &aop_console_how); #endif } virObjectLock(vm); diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index ce7b95a547..cd56cbcd7b 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -3991,10 +3991,8 @@ libxlDomainOpenConsole(virDomainPtr dom, { virDomainObjPtr vm = NULL; int ret = -1; - libxl_console_type console_type; virDomainChrDefPtr chr = NULL; libxlDomainObjPrivatePtr priv; - char *console = NULL; virCheckFlags(VIR_DOMAIN_CONSOLE_FORCE, -1); @@ -4036,18 +4034,6 @@ libxlDomainOpenConsole(virDomainPtr dom, goto cleanup; } - console_type = - (chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL ? - LIBXL_CONSOLE_TYPE_SERIAL : LIBXL_CONSOLE_TYPE_PV); - - ret = libxl_console_get_tty(priv->ctx, vm->def->id, chr->target.port, - console_type, &console); - if (ret) - goto cleanup; - - if (VIR_STRDUP(chr->source.data.file.path, console) < 0) - goto cleanup; - /* handle mutually exclusive access to console devices */ ret = virChrdevOpen(priv->devs, &chr->source, @@ -4061,7 +4047,6 @@ libxlDomainOpenConsole(virDomainPtr dom, } cleanup: - VIR_FREE(console); if (vm) virObjectUnlock(vm); return ret; -- 2.47.2