libxl: remove per-domain libxl_ctx

Although needed in the Xen 4.1 libxl days, there is no longer any
benefit to having per-domain libxl_ctx.  On the contrary, their use
makes the code unecessarily complicated and prone to deadlocks under
load.  As suggested by the libxl maintainers, use a single libxl_ctx
as a handle to libxl instead of per-domain ctx's.

One downside to using a single libxl_ctx is there are no longer
per-domain log files for log messages emitted by libxl.  Messages
for all domains will be sent to /var/log/libvirt/libxl/libxl-driver.log.

Signed-off-by: Jim Fehlig <jfehlig@suse.com>
This commit is contained in:
Jim Fehlig 2015-02-11 16:40:07 -07:00
parent 6728645a41
commit a5bf06ba34
4 changed files with 147 additions and 216 deletions

View File

@ -210,11 +210,6 @@ libxlDomainObjPrivateDispose(void *obj)
libxlDomainObjFreeJob(priv);
virChrdevFree(priv->devs);
libxl_ctx_free(priv->ctx);
if (priv->logger_file)
VIR_FORCE_FCLOSE(priv->logger_file);
xtl_logger_destroy(priv->logger);
}
static void
@ -533,49 +528,6 @@ libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_CONST libxl_event *event)
virObjectUnlock(vm);
}
int
libxlDomainObjPrivateInitCtx(virDomainObjPtr vm)
{
libxlDomainObjPrivatePtr priv = vm->privateData;
char *log_file;
int ret = -1;
if (priv->ctx)
return 0;
if (virAsprintf(&log_file, "%s/%s.log", LIBXL_LOG_DIR, vm->def->name) < 0)
return -1;
if ((priv->logger_file = fopen(log_file, "a")) == NULL) {
virReportSystemError(errno,
_("failed to open logfile %s"),
log_file);
goto cleanup;
}
priv->logger =
(xentoollog_logger *)xtl_createlogger_stdiostream(priv->logger_file,
XTL_DEBUG, 0);
if (!priv->logger) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("cannot create libxenlight logger for domain %s"),
vm->def->name);
goto cleanup;
}
if (libxl_ctx_alloc(&priv->ctx, LIBXL_VERSION, 0, priv->logger)) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Failed libxl context initialization"));
goto cleanup;
}
ret = 0;
cleanup:
VIR_FREE(log_file);
return ret;
}
void
libxlDomainEventQueue(libxlDriverPrivatePtr driver, virObjectEventPtr event)
{
@ -690,7 +642,7 @@ libxlDomainCleanup(libxlDriverPrivatePtr driver,
vm->def->id = -1;
if (priv->deathW) {
libxl_evdisable_domain_death(priv->ctx, priv->deathW);
libxl_evdisable_domain_death(cfg->ctx, priv->deathW);
priv->deathW = NULL;
}
@ -766,7 +718,6 @@ int
libxlDomainAutoCoreDump(libxlDriverPrivatePtr driver,
virDomainObjPtr vm)
{
libxlDomainObjPrivatePtr priv = vm->privateData;
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
time_t curtime = time(NULL);
char timestr[100];
@ -788,7 +739,7 @@ libxlDomainAutoCoreDump(libxlDriverPrivatePtr driver,
/* Unlock virDomainObj while dumping core */
virObjectUnlock(vm);
libxl_domain_core_dump(priv->ctx, vm->def->id, dumpfile, NULL);
libxl_domain_core_dump(cfg->ctx, vm->def->id, dumpfile, NULL);
virObjectLock(vm);
ignore_value(libxlDomainObjEndJob(driver, vm));
@ -804,7 +755,7 @@ libxlDomainAutoCoreDump(libxlDriverPrivatePtr driver,
int
libxlDomainSetVcpuAffinities(libxlDriverPrivatePtr driver, virDomainObjPtr vm)
{
libxlDomainObjPrivatePtr priv = vm->privateData;
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
virDomainDefPtr def = vm->def;
libxl_bitmap map;
virBitmapPtr cpumask = NULL;
@ -837,7 +788,7 @@ libxlDomainSetVcpuAffinities(libxlDriverPrivatePtr driver, virDomainObjPtr vm)
map.size = cpumaplen;
map.map = cpumap;
if (libxl_set_vcpuaffinity(priv->ctx, def->id, vcpu, &map) != 0) {
if (libxl_set_vcpuaffinity(cfg->ctx, def->id, vcpu, &map) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to pin vcpu '%d' with libxenlight"), vcpu);
goto cleanup;
@ -850,6 +801,7 @@ libxlDomainSetVcpuAffinities(libxlDriverPrivatePtr driver, virDomainObjPtr vm)
cleanup:
VIR_FREE(cpumap);
virObjectUnref(cfg);
return ret;
}
@ -955,9 +907,6 @@ libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
libxl_domain_config_init(&d_config);
if (libxlDomainObjPrivateInitCtx(vm) < 0)
return ret;
if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0)
return ret;
@ -1005,10 +954,10 @@ libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
}
if (libxlBuildDomainConfig(driver->reservedVNCPorts, vm->def,
priv->ctx, &d_config) < 0)
cfg->ctx, &d_config) < 0)
goto endjob;
if (cfg->autoballoon && libxlDomainFreeMem(priv->ctx, &d_config) < 0) {
if (cfg->autoballoon && libxlDomainFreeMem(cfg->ctx, &d_config) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("libxenlight failed to get free memory for domain '%s'"),
d_config.c_info.name);
@ -1025,16 +974,16 @@ libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr 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,
ret = libxl_domain_create_new(cfg->ctx, &d_config,
&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,
ret = libxl_domain_create_restore(cfg->ctx, &d_config, &domid,
restore_fd, &params, NULL,
&aop_console_how);
#else
ret = libxl_domain_create_restore(priv->ctx, &d_config, &domid,
ret = libxl_domain_create_restore(cfg->ctx, &d_config, &domid,
restore_fd, NULL, &aop_console_how);
#endif
}
@ -1059,13 +1008,13 @@ libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
vm->def->id = domid;
/* Always enable domain death events */
if (libxl_evenable_domain_death(priv->ctx, vm->def->id, 0, &priv->deathW))
if (libxl_evenable_domain_death(cfg->ctx, vm->def->id, 0, &priv->deathW))
goto cleanup_dom;
if ((dom_xml = virDomainDefFormat(vm->def, 0)) == NULL)
goto cleanup_dom;
if (libxl_userdata_store(priv->ctx, domid, "libvirt-xml",
if (libxl_userdata_store(cfg->ctx, domid, "libvirt-xml",
(uint8_t *)dom_xml, strlen(dom_xml) + 1)) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("libxenlight failed to store userdata"));
@ -1076,7 +1025,7 @@ libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
goto cleanup_dom;
if (!start_paused) {
libxl_domain_unpause(priv->ctx, domid);
libxl_domain_unpause(cfg->ctx, domid);
virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, VIR_DOMAIN_RUNNING_BOOTED);
} else {
virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, VIR_DOMAIN_PAUSED_USER);
@ -1100,10 +1049,10 @@ libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
cleanup_dom:
if (priv->deathW) {
libxl_evdisable_domain_death(priv->ctx, priv->deathW);
libxl_evdisable_domain_death(cfg->ctx, priv->deathW);
priv->deathW = NULL;
}
libxl_domain_destroy(priv->ctx, domid, NULL);
libxl_domain_destroy(cfg->ctx, domid, NULL);
vm->def->id = -1;
virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, VIR_DOMAIN_SHUTOFF_FAILED);

View File

@ -60,11 +60,6 @@ typedef libxlDomainObjPrivate *libxlDomainObjPrivatePtr;
struct _libxlDomainObjPrivate {
virObjectLockable parent;
/* per domain log stream for libxl messages */
FILE *logger_file;
xentoollog_logger *logger;
/* per domain libxl ctx */
libxl_ctx *ctx;
/* console */
virChrdevsPtr devs;
libxl_evgen_domain_death *deathW;

View File

@ -328,6 +328,7 @@ libxlReconnectDomain(virDomainObjPtr vm,
{
libxlDriverPrivatePtr driver = opaque;
libxlDomainObjPrivatePtr priv = vm->privateData;
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
int rc;
libxl_dominfo d_info;
int len;
@ -336,9 +337,8 @@ libxlReconnectDomain(virDomainObjPtr vm,
virObjectLock(vm);
libxlDomainObjPrivateInitCtx(vm);
/* Does domain still exist? */
rc = libxl_domain_info(priv->ctx, &d_info, vm->def->id);
rc = libxl_domain_info(cfg->ctx, &d_info, vm->def->id);
if (rc == ERROR_INVAL) {
goto out;
} else if (rc != 0) {
@ -348,7 +348,7 @@ libxlReconnectDomain(virDomainObjPtr vm,
}
/* Is this a domain that was under libvirt control? */
if (libxl_userdata_retrieve(priv->ctx, vm->def->id,
if (libxl_userdata_retrieve(cfg->ctx, vm->def->id,
"libvirt-xml", &data, &len)) {
VIR_DEBUG("libxl_userdata_retrieve failed, ignoring domain %d", vm->def->id);
goto out;
@ -368,9 +368,10 @@ libxlReconnectDomain(virDomainObjPtr vm,
driver->inhibitCallback(true, driver->inhibitOpaque);
/* Enable domain death events */
libxl_evenable_domain_death(priv->ctx, vm->def->id, 0, &priv->deathW);
libxl_evenable_domain_death(cfg->ctx, vm->def->id, 0, &priv->deathW);
virObjectUnlock(vm);
virObjectUnref(cfg);
return 0;
out:
@ -379,6 +380,7 @@ libxlReconnectDomain(virDomainObjPtr vm,
virDomainObjListRemoveLocked(driver->domains, vm);
else
virObjectUnlock(vm);
virObjectUnref(cfg);
return -1;
}
@ -986,7 +988,6 @@ libxlDomainSuspend(virDomainPtr dom)
libxlDriverPrivatePtr driver = dom->conn->privateData;
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
virDomainObjPtr vm;
libxlDomainObjPrivatePtr priv;
virObjectEventPtr event = NULL;
int ret = -1;
@ -1004,10 +1005,8 @@ libxlDomainSuspend(virDomainPtr dom)
goto endjob;
}
priv = vm->privateData;
if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_PAUSED) {
if (libxl_domain_pause(priv->ctx, vm->def->id) != 0) {
if (libxl_domain_pause(cfg->ctx, vm->def->id) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to suspend domain '%d' with libxenlight"),
vm->def->id);
@ -1045,7 +1044,6 @@ libxlDomainResume(virDomainPtr dom)
libxlDriverPrivatePtr driver = dom->conn->privateData;
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
virDomainObjPtr vm;
libxlDomainObjPrivatePtr priv;
virObjectEventPtr event = NULL;
int ret = -1;
@ -1063,10 +1061,8 @@ libxlDomainResume(virDomainPtr dom)
goto endjob;
}
priv = vm->privateData;
if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED) {
if (libxl_domain_unpause(priv->ctx, vm->def->id) != 0) {
if (libxl_domain_unpause(cfg->ctx, vm->def->id) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to resume domain '%d' with libxenlight"),
vm->def->id);
@ -1101,9 +1097,10 @@ libxlDomainResume(virDomainPtr dom)
static int
libxlDomainShutdownFlags(virDomainPtr dom, unsigned int flags)
{
libxlDriverPrivatePtr driver = dom->conn->privateData;
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
virDomainObjPtr vm;
int ret = -1;
libxlDomainObjPrivatePtr priv;
virCheckFlags(VIR_DOMAIN_SHUTDOWN_ACPI_POWER_BTN |
VIR_DOMAIN_SHUTDOWN_PARAVIRT, -1);
@ -1123,9 +1120,8 @@ libxlDomainShutdownFlags(virDomainPtr dom, unsigned int flags)
goto cleanup;
}
priv = vm->privateData;
if (flags & VIR_DOMAIN_SHUTDOWN_PARAVIRT) {
ret = libxl_domain_shutdown(priv->ctx, vm->def->id);
ret = libxl_domain_shutdown(cfg->ctx, vm->def->id);
if (ret == 0)
goto cleanup;
@ -1140,7 +1136,7 @@ libxlDomainShutdownFlags(virDomainPtr dom, unsigned int flags)
}
if (flags & VIR_DOMAIN_SHUTDOWN_ACPI_POWER_BTN) {
ret = libxl_send_trigger(priv->ctx, vm->def->id,
ret = libxl_send_trigger(cfg->ctx, vm->def->id,
LIBXL_TRIGGER_POWER, 0);
if (ret == 0)
goto cleanup;
@ -1154,6 +1150,7 @@ libxlDomainShutdownFlags(virDomainPtr dom, unsigned int flags)
cleanup:
if (vm)
virObjectUnlock(vm);
virObjectUnref(cfg);
return ret;
}
@ -1167,9 +1164,10 @@ libxlDomainShutdown(virDomainPtr dom)
static int
libxlDomainReboot(virDomainPtr dom, unsigned int flags)
{
libxlDriverPrivatePtr driver = dom->conn->privateData;
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
virDomainObjPtr vm;
int ret = -1;
libxlDomainObjPrivatePtr priv;
virCheckFlags(VIR_DOMAIN_REBOOT_PARAVIRT, -1);
if (flags == 0)
@ -1187,9 +1185,8 @@ libxlDomainReboot(virDomainPtr dom, unsigned int flags)
goto cleanup;
}
priv = vm->privateData;
if (flags & VIR_DOMAIN_REBOOT_PARAVIRT) {
ret = libxl_domain_reboot(priv->ctx, vm->def->id);
ret = libxl_domain_reboot(cfg->ctx, vm->def->id);
if (ret == 0)
goto cleanup;
@ -1202,6 +1199,7 @@ libxlDomainReboot(virDomainPtr dom, unsigned int flags)
cleanup:
if (vm)
virObjectUnlock(vm);
virObjectUnref(cfg);
return ret;
}
@ -1210,10 +1208,10 @@ libxlDomainDestroyFlags(virDomainPtr dom,
unsigned int flags)
{
libxlDriverPrivatePtr driver = dom->conn->privateData;
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
virDomainObjPtr vm;
int ret = -1;
virObjectEventPtr event = NULL;
libxlDomainObjPrivatePtr priv;
virCheckFlags(0, -1);
@ -1232,8 +1230,7 @@ libxlDomainDestroyFlags(virDomainPtr dom,
event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_DESTROYED);
priv = vm->privateData;
if (libxl_domain_destroy(priv->ctx, vm->def->id, NULL) < 0) {
if (libxl_domain_destroy(cfg->ctx, vm->def->id, NULL) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to destroy domain '%d'"), vm->def->id);
goto cleanup;
@ -1253,6 +1250,7 @@ libxlDomainDestroyFlags(virDomainPtr dom,
virObjectUnlock(vm);
if (event)
libxlDomainEventQueue(driver, event);
virObjectUnref(cfg);
return ret;
}
@ -1309,7 +1307,6 @@ libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
{
libxlDriverPrivatePtr driver = dom->conn->privateData;
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
libxlDomainObjPrivatePtr priv;
virDomainObjPtr vm;
virDomainDefPtr persistentDef = NULL;
bool isActive;
@ -1365,8 +1362,7 @@ libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
/* resize the maximum memory */
if (flags & VIR_DOMAIN_MEM_LIVE) {
priv = vm->privateData;
if (libxl_domain_setmaxmem(priv->ctx, vm->def->id, newmem) < 0) {
if (libxl_domain_setmaxmem(cfg->ctx, vm->def->id, newmem) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to set maximum memory for domain '%d'"
" with libxenlight"), vm->def->id);
@ -1396,10 +1392,9 @@ libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
if (flags & VIR_DOMAIN_MEM_LIVE) {
int res;
priv = vm->privateData;
/* Unlock virDomainObj while ballooning memory */
virObjectUnlock(vm);
res = libxl_set_memory_target(priv->ctx, vm->def->id, newmem, 0,
res = libxl_set_memory_target(cfg->ctx, vm->def->id, newmem, 0,
/* force */ 1);
virObjectLock(vm);
if (res < 0) {
@ -1446,9 +1441,10 @@ libxlDomainSetMaxMemory(virDomainPtr dom, unsigned long memory)
static int
libxlDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info)
{
libxlDriverPrivatePtr driver = dom->conn->privateData;
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
virDomainObjPtr vm;
libxl_dominfo d_info;
libxlDomainObjPrivatePtr priv;
int ret = -1;
if (!(vm = libxlDomObjFromDomain(dom)))
@ -1457,13 +1453,12 @@ libxlDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info)
if (virDomainGetInfoEnsureACL(dom->conn, vm->def) < 0)
goto cleanup;
priv = vm->privateData;
if (!virDomainObjIsActive(vm)) {
info->cpuTime = 0;
info->memory = vm->def->mem.cur_balloon;
info->maxMem = virDomainDefGetMemoryActual(vm->def);
} else {
if (libxl_domain_info(priv->ctx, &d_info, vm->def->id) != 0) {
if (libxl_domain_info(cfg->ctx, &d_info, vm->def->id) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("libxl_domain_info failed for domain '%d'"),
vm->def->id);
@ -1481,6 +1476,7 @@ libxlDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info)
cleanup:
if (vm)
virObjectUnlock(vm);
virObjectUnref(cfg);
return ret;
}
@ -1517,7 +1513,7 @@ static int
libxlDoDomainSave(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
const char *to)
{
libxlDomainObjPrivatePtr priv = vm->privateData;
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
libxlSavefileHeader hdr;
virObjectEventPtr event = NULL;
char *xml = NULL;
@ -1562,7 +1558,7 @@ libxlDoDomainSave(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
/* Unlock virDomainObj while saving domain */
virObjectUnlock(vm);
ret = libxl_domain_suspend(priv->ctx, vm->def->id, fd, 0, NULL);
ret = libxl_domain_suspend(cfg->ctx, vm->def->id, fd, 0, NULL);
virObjectLock(vm);
if (ret != 0) {
@ -1576,7 +1572,7 @@ libxlDoDomainSave(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_SAVED);
if (libxl_domain_destroy(priv->ctx, vm->def->id, NULL) < 0) {
if (libxl_domain_destroy(cfg->ctx, vm->def->id, NULL) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to destroy domain '%d'"), vm->def->id);
goto cleanup;
@ -1592,6 +1588,7 @@ libxlDoDomainSave(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
virReportSystemError(errno, "%s", _("cannot close file"));
if (event)
libxlDomainEventQueue(driver, event);
virObjectUnref(cfg);
return ret;
}
@ -1724,7 +1721,7 @@ static int
libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags)
{
libxlDriverPrivatePtr driver = dom->conn->privateData;
libxlDomainObjPrivatePtr priv;
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
virDomainObjPtr vm;
virObjectEventPtr event = NULL;
bool remove_dom = false;
@ -1747,11 +1744,9 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags)
goto endjob;
}
priv = vm->privateData;
if (!(flags & VIR_DUMP_LIVE) &&
virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
if (libxl_domain_pause(priv->ctx, vm->def->id) != 0) {
if (libxl_domain_pause(cfg->ctx, vm->def->id) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Before dumping core, failed to suspend domain '%d'"
" with libxenlight"),
@ -1764,7 +1759,7 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags)
/* Unlock virDomainObj while dumping core */
virObjectUnlock(vm);
ret = libxl_domain_core_dump(priv->ctx, vm->def->id, to, NULL);
ret = libxl_domain_core_dump(cfg->ctx, vm->def->id, to, NULL);
virObjectLock(vm);
if (ret != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
@ -1775,7 +1770,7 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags)
}
if (flags & VIR_DUMP_CRASH) {
if (libxl_domain_destroy(priv->ctx, vm->def->id, NULL) < 0) {
if (libxl_domain_destroy(cfg->ctx, vm->def->id, NULL) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to destroy domain '%d'"), vm->def->id);
goto unpause;
@ -1792,7 +1787,7 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags)
unpause:
if (virDomainObjIsActive(vm) && paused) {
if (libxl_domain_unpause(priv->ctx, vm->def->id) != 0) {
if (libxl_domain_unpause(cfg->ctx, vm->def->id) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("After dumping core, failed to resume domain '%d' with"
" libxenlight"), vm->def->id);
@ -1815,6 +1810,7 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags)
virObjectUnlock(vm);
if (event)
libxlDomainEventQueue(driver, event);
virObjectUnref(cfg);
return ret;
}
@ -1957,7 +1953,6 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
{
libxlDriverPrivatePtr driver = dom->conn->privateData;
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
libxlDomainObjPrivatePtr priv;
virDomainDefPtr def;
virDomainObjPtr vm;
libxl_bitmap map;
@ -2024,8 +2019,6 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
goto endjob;
}
priv = vm->privateData;
if (!(def = virDomainObjGetPersistentDef(cfg->caps, driver->xmlopt, vm)))
goto endjob;
@ -2053,7 +2046,7 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
break;
case VIR_DOMAIN_VCPU_LIVE:
if (libxl_set_vcpuonline(priv->ctx, vm->def->id, &map) != 0) {
if (libxl_set_vcpuonline(cfg->ctx, vm->def->id, &map) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to set vcpus for domain '%d'"
" with libxenlight"), vm->def->id);
@ -2062,7 +2055,7 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
break;
case VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG:
if (libxl_set_vcpuonline(priv->ctx, vm->def->id, &map) != 0) {
if (libxl_set_vcpuonline(cfg->ctx, vm->def->id, &map) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to set vcpus for domain '%d'"
" with libxenlight"), vm->def->id);
@ -2197,10 +2190,7 @@ libxlDomainPinVcpuFlags(virDomainPtr dom, unsigned int vcpu,
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
libxl_bitmap map = { .size = maplen, .map = cpumap };
libxlDomainObjPrivatePtr priv;
priv = vm->privateData;
if (libxl_set_vcpuaffinity(priv->ctx, vm->def->id, vcpu, &map) != 0) {
if (libxl_set_vcpuaffinity(cfg->ctx, vm->def->id, vcpu, &map) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to pin vcpu '%d' with libxenlight"),
vcpu);
@ -2297,7 +2287,6 @@ libxlDomainGetVcpuPinInfo(virDomainPtr dom, int ncpumaps,
if (ncpumaps > targetDef->vcpus)
ncpumaps = targetDef->vcpus;
/* we use cfg->ctx, as vm->privateData->ctx may be NULL if VM is down. */
if ((hostcpus = libxl_get_max_cpus(cfg->ctx)) < 0)
goto cleanup;
@ -2338,7 +2327,8 @@ static int
libxlDomainGetVcpus(virDomainPtr dom, virVcpuInfoPtr info, int maxinfo,
unsigned char *cpumaps, int maplen)
{
libxlDomainObjPrivatePtr priv;
libxlDriverPrivatePtr driver = dom->conn->privateData;
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
virDomainObjPtr vm;
int ret = -1;
libxl_vcpuinfo *vcpuinfo;
@ -2357,8 +2347,7 @@ libxlDomainGetVcpus(virDomainPtr dom, virVcpuInfoPtr info, int maxinfo,
goto cleanup;
}
priv = vm->privateData;
if ((vcpuinfo = libxl_list_vcpu(priv->ctx, vm->def->id, &maxcpu,
if ((vcpuinfo = libxl_list_vcpu(cfg->ctx, vm->def->id, &maxcpu,
&hostcpus)) == NULL) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to list vcpus for domain '%d' with libxenlight"),
@ -2394,6 +2383,7 @@ libxlDomainGetVcpus(virDomainPtr dom, virVcpuInfoPtr info, int maxinfo,
cleanup:
if (vm)
virObjectUnlock(vm);
virObjectUnref(cfg);
return ret;
}
@ -2743,9 +2733,9 @@ libxlDomainUndefine(virDomainPtr dom)
}
static int
libxlDomainChangeEjectableMedia(libxlDomainObjPrivatePtr priv,
virDomainObjPtr vm, virDomainDiskDefPtr disk)
libxlDomainChangeEjectableMedia(virDomainObjPtr vm, virDomainDiskDefPtr disk)
{
libxlDriverConfigPtr cfg = libxlDriverConfigGet(libxl_driver);
virDomainDiskDefPtr origdisk = NULL;
libxl_device_disk x_disk;
size_t i;
@ -2776,7 +2766,7 @@ libxlDomainChangeEjectableMedia(libxlDomainObjPrivatePtr priv,
if (libxlMakeDisk(disk, &x_disk) < 0)
goto cleanup;
if ((ret = libxl_cdrom_insert(priv->ctx, vm->def->id, &x_disk, NULL)) < 0) {
if ((ret = libxl_cdrom_insert(cfg->ctx, vm->def->id, &x_disk, NULL)) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("libxenlight failed to change media for disk '%s'"),
disk->dst);
@ -2792,20 +2782,21 @@ libxlDomainChangeEjectableMedia(libxlDomainObjPrivatePtr priv,
ret = 0;
cleanup:
virObjectUnref(cfg);
return ret;
}
static int
libxlDomainAttachDeviceDiskLive(libxlDomainObjPrivatePtr priv,
virDomainObjPtr vm, virDomainDeviceDefPtr dev)
libxlDomainAttachDeviceDiskLive(virDomainObjPtr vm, virDomainDeviceDefPtr dev)
{
libxlDriverConfigPtr cfg = libxlDriverConfigGet(libxl_driver);
virDomainDiskDefPtr l_disk = dev->data.disk;
libxl_device_disk x_disk;
int ret = -1;
switch (l_disk->device) {
case VIR_DOMAIN_DISK_DEVICE_CDROM:
ret = libxlDomainChangeEjectableMedia(priv, vm, l_disk);
ret = libxlDomainChangeEjectableMedia(vm, l_disk);
break;
case VIR_DOMAIN_DISK_DEVICE_DISK:
if (l_disk->bus == VIR_DOMAIN_DISK_BUS_XEN) {
@ -2827,7 +2818,7 @@ libxlDomainAttachDeviceDiskLive(libxlDomainObjPrivatePtr priv,
if (libxlMakeDisk(l_disk, &x_disk) < 0)
goto cleanup;
if ((ret = libxl_device_disk_add(priv->ctx, vm->def->id,
if ((ret = libxl_device_disk_add(cfg->ctx, vm->def->id,
&x_disk, NULL)) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("libxenlight failed to attach disk '%s'"),
@ -2851,43 +2842,45 @@ libxlDomainAttachDeviceDiskLive(libxlDomainObjPrivatePtr priv,
}
cleanup:
virObjectUnref(cfg);
return ret;
}
static int
libxlDomainAttachHostPCIDevice(libxlDriverPrivatePtr driver,
libxlDomainObjPrivatePtr priv,
virDomainObjPtr vm,
virDomainHostdevDefPtr hostdev)
{
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
libxl_device_pci pcidev;
virDomainHostdevDefPtr found;
virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr;
virDomainHostdevSubsysPCIPtr pcisrc = &hostdev->source.subsys.u.pci;
int ret = -1;
if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
return -1;
goto cleanup;
if (virDomainHostdevFind(vm->def, hostdev, &found) >= 0) {
virReportError(VIR_ERR_OPERATION_FAILED,
_("target pci device %.4x:%.2x:%.2x.%.1x already exists"),
pcisrc->addr.domain, pcisrc->addr.bus,
pcisrc->addr.slot, pcisrc->addr.function);
return -1;
goto cleanup;
}
if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + 1) < 0)
return -1;
goto cleanup;
if (virHostdevPreparePCIDevices(hostdev_mgr, LIBXL_DRIVER_NAME,
vm->def->name, vm->def->uuid,
&hostdev, 1, 0) < 0)
return -1;
goto cleanup;
if (libxlMakePCI(hostdev, &pcidev) < 0)
goto error;
if (libxl_device_pci_add(priv->ctx, vm->def->id, &pcidev, 0) < 0) {
if (libxl_device_pci_add(cfg->ctx, vm->def->id, &pcidev, 0) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("libxenlight failed to attach pci device %.4x:%.2x:%.2x.%.1x"),
pcisrc->addr.domain, pcisrc->addr.bus,
@ -2896,17 +2889,20 @@ libxlDomainAttachHostPCIDevice(libxlDriverPrivatePtr driver,
}
vm->def->hostdevs[vm->def->nhostdevs++] = hostdev;
return 0;
ret = 0;
goto cleanup;
error:
virHostdevReAttachPCIDevices(hostdev_mgr, LIBXL_DRIVER_NAME,
vm->def->name, &hostdev, 1, NULL);
return -1;
cleanup:
virObjectUnref(cfg);
return ret;
}
static int
libxlDomainAttachHostDevice(libxlDriverPrivatePtr driver,
libxlDomainObjPrivatePtr priv,
virDomainObjPtr vm,
virDomainHostdevDefPtr hostdev)
{
@ -2919,7 +2915,7 @@ libxlDomainAttachHostDevice(libxlDriverPrivatePtr driver,
switch (hostdev->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
if (libxlDomainAttachHostPCIDevice(driver, priv, vm, hostdev) < 0)
if (libxlDomainAttachHostPCIDevice(driver, vm, hostdev) < 0)
return -1;
break;
@ -2934,9 +2930,9 @@ libxlDomainAttachHostDevice(libxlDriverPrivatePtr driver,
}
static int
libxlDomainDetachDeviceDiskLive(libxlDomainObjPrivatePtr priv,
virDomainObjPtr vm, virDomainDeviceDefPtr dev)
libxlDomainDetachDeviceDiskLive(virDomainObjPtr vm, virDomainDeviceDefPtr dev)
{
libxlDriverConfigPtr cfg = libxlDriverConfigGet(libxl_driver);
virDomainDiskDefPtr l_disk = NULL;
libxl_device_disk x_disk;
int idx;
@ -2959,7 +2955,7 @@ libxlDomainDetachDeviceDiskLive(libxlDomainObjPrivatePtr priv,
if (libxlMakeDisk(l_disk, &x_disk) < 0)
goto cleanup;
if ((ret = libxl_device_disk_remove(priv->ctx, vm->def->id,
if ((ret = libxl_device_disk_remove(cfg->ctx, vm->def->id,
&x_disk, NULL)) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("libxenlight failed to detach disk '%s'"),
@ -2984,15 +2980,16 @@ libxlDomainDetachDeviceDiskLive(libxlDomainObjPrivatePtr priv,
}
cleanup:
virObjectUnref(cfg);
return ret;
}
static int
libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver,
libxlDomainObjPrivatePtr priv,
virDomainObjPtr vm,
virDomainNetDefPtr net)
{
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
int actualType;
libxl_device_nic nic;
int ret = -1;
@ -3000,14 +2997,14 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver,
/* preallocate new slot for device */
if (VIR_REALLOC_N(vm->def->nets, vm->def->nnets + 1) < 0)
return -1;
goto out;
/* If appropriate, grab a physical device from the configured
* network's pool of devices, or resolve bridge device name
* to the one defined in the network definition.
*/
if (networkAllocateActualDevice(vm->def, net) < 0)
return -1;
goto out;
actualType = virDomainNetGetActualType(net);
@ -3024,7 +3021,7 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver,
* netdev-specific code as appropriate), then also added to
* the nets list (see out:) if successful.
*/
ret = libxlDomainAttachHostDevice(driver, priv, vm,
ret = libxlDomainAttachHostDevice(driver, vm,
virDomainNetGetActualHostdev(net));
goto out;
}
@ -3033,7 +3030,7 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver,
if (libxlMakeNic(vm->def, net, &nic) < 0)
goto cleanup;
if (libxl_device_nic_add(priv->ctx, vm->def->id, &nic, 0)) {
if (libxl_device_nic_add(cfg->ctx, vm->def->id, &nic, 0)) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("libxenlight failed to attach network device"));
goto cleanup;
@ -3046,12 +3043,12 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver,
out:
if (!ret)
vm->def->nets[vm->def->nnets++] = net;
virObjectUnref(cfg);
return ret;
}
static int
libxlDomainAttachDeviceLive(libxlDriverPrivatePtr driver,
libxlDomainObjPrivatePtr priv,
virDomainObjPtr vm,
virDomainDeviceDefPtr dev)
{
@ -3059,20 +3056,20 @@ libxlDomainAttachDeviceLive(libxlDriverPrivatePtr driver,
switch (dev->type) {
case VIR_DOMAIN_DEVICE_DISK:
ret = libxlDomainAttachDeviceDiskLive(priv, vm, dev);
ret = libxlDomainAttachDeviceDiskLive(vm, dev);
if (!ret)
dev->data.disk = NULL;
break;
case VIR_DOMAIN_DEVICE_NET:
ret = libxlDomainAttachNetDevice(driver, priv, vm,
ret = libxlDomainAttachNetDevice(driver, vm,
dev->data.net);
if (!ret)
dev->data.net = NULL;
break;
case VIR_DOMAIN_DEVICE_HOSTDEV:
ret = libxlDomainAttachHostDevice(driver, priv, vm,
ret = libxlDomainAttachHostDevice(driver, vm,
dev->data.hostdev);
if (!ret)
dev->data.hostdev = NULL;
@ -3184,19 +3181,20 @@ libxlIsMultiFunctionDevice(virDomainDefPtr def,
static int
libxlDomainDetachHostPCIDevice(libxlDriverPrivatePtr driver,
libxlDomainObjPrivatePtr priv,
virDomainObjPtr vm,
virDomainHostdevDefPtr hostdev)
{
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
virDomainHostdevSubsysPtr subsys = &hostdev->source.subsys;
virDomainHostdevSubsysPCIPtr pcisrc = &subsys->u.pci;
libxl_device_pci pcidev;
virDomainHostdevDefPtr detach;
int idx;
virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr;
int ret = -1;
if (subsys->type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
return -1;
goto cleanup;
idx = virDomainHostdevFind(vm->def, hostdev, &detach);
if (idx < 0) {
@ -3204,7 +3202,7 @@ libxlDomainDetachHostPCIDevice(libxlDriverPrivatePtr driver,
_("host pci device %.4x:%.2x:%.2x.%.1x not found"),
pcisrc->addr.domain, pcisrc->addr.bus,
pcisrc->addr.slot, pcisrc->addr.function);
return -1;
goto cleanup;
}
if (libxlIsMultiFunctionDevice(vm->def, detach->info)) {
@ -3221,7 +3219,7 @@ libxlDomainDetachHostPCIDevice(libxlDriverPrivatePtr driver,
if (libxlMakePCI(detach, &pcidev) < 0)
goto error;
if (libxl_device_pci_remove(priv->ctx, vm->def->id, &pcidev, 0) < 0) {
if (libxl_device_pci_remove(cfg->ctx, vm->def->id, &pcidev, 0) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("libxenlight failed to detach pci device\
%.4x:%.2x:%.2x.%.1x"),
@ -3237,16 +3235,18 @@ libxlDomainDetachHostPCIDevice(libxlDriverPrivatePtr driver,
virHostdevReAttachPCIDevices(hostdev_mgr, LIBXL_DRIVER_NAME,
vm->def->name, &hostdev, 1, NULL);
return 0;
ret = 0;
error:
virDomainHostdevDefFree(detach);
return -1;
cleanup:
virObjectUnref(cfg);
return ret;
}
static int
libxlDomainDetachHostDevice(libxlDriverPrivatePtr driver,
libxlDomainObjPrivatePtr priv,
virDomainObjPtr vm,
virDomainHostdevDefPtr hostdev)
{
@ -3261,7 +3261,7 @@ libxlDomainDetachHostDevice(libxlDriverPrivatePtr driver,
switch (subsys->type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
return libxlDomainDetachHostPCIDevice(driver, priv, vm, hostdev);
return libxlDomainDetachHostPCIDevice(driver, vm, hostdev);
default:
virReportError(VIR_ERR_INTERNAL_ERROR,
@ -3274,10 +3274,10 @@ libxlDomainDetachHostDevice(libxlDriverPrivatePtr driver,
static int
libxlDomainDetachNetDevice(libxlDriverPrivatePtr driver,
libxlDomainObjPrivatePtr priv,
virDomainObjPtr vm,
virDomainNetDefPtr net)
{
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
int detachidx;
virDomainNetDefPtr detach = NULL;
libxl_device_nic nic;
@ -3285,7 +3285,7 @@ libxlDomainDetachNetDevice(libxlDriverPrivatePtr driver,
int ret = -1;
if ((detachidx = virDomainNetFindIdx(vm->def, net)) < 0)
return -1;
goto out;
detach = vm->def->nets[detachidx];
@ -3293,17 +3293,17 @@ libxlDomainDetachNetDevice(libxlDriverPrivatePtr driver,
/* This is really a "smart hostdev", so it should be attached as a
* hostdev, then also removed from nets list (see out:) if successful.
*/
ret = libxlDomainDetachHostDevice(driver, priv, vm,
ret = libxlDomainDetachHostDevice(driver, vm,
virDomainNetGetActualHostdev(detach));
goto out;
}
libxl_device_nic_init(&nic);
if (libxl_mac_to_device_nic(priv->ctx, vm->def->id,
if (libxl_mac_to_device_nic(cfg->ctx, vm->def->id,
virMacAddrFormat(&detach->mac, mac), &nic))
goto cleanup;
if (libxl_device_nic_remove(priv->ctx, vm->def->id, &nic, 0)) {
if (libxl_device_nic_remove(cfg->ctx, vm->def->id, &nic, 0)) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("libxenlight failed to detach network device"));
goto cleanup;
@ -3316,12 +3316,12 @@ libxlDomainDetachNetDevice(libxlDriverPrivatePtr driver,
out:
if (!ret)
virDomainNetRemove(vm->def, detachidx);
virObjectUnref(cfg);
return ret;
}
static int
libxlDomainDetachDeviceLive(libxlDriverPrivatePtr driver,
libxlDomainObjPrivatePtr priv,
virDomainObjPtr vm,
virDomainDeviceDefPtr dev)
{
@ -3329,16 +3329,16 @@ libxlDomainDetachDeviceLive(libxlDriverPrivatePtr driver,
switch (dev->type) {
case VIR_DOMAIN_DEVICE_DISK:
ret = libxlDomainDetachDeviceDiskLive(priv, vm, dev);
ret = libxlDomainDetachDeviceDiskLive(vm, dev);
break;
case VIR_DOMAIN_DEVICE_NET:
ret = libxlDomainDetachNetDevice(driver, priv, vm,
ret = libxlDomainDetachNetDevice(driver, vm,
dev->data.net);
break;
case VIR_DOMAIN_DEVICE_HOSTDEV:
ret = libxlDomainDetachHostDevice(driver, priv, vm,
ret = libxlDomainDetachHostDevice(driver, vm,
dev->data.hostdev);
break;
@ -3403,8 +3403,7 @@ libxlDomainDetachDeviceConfig(virDomainDefPtr vmdef, virDomainDeviceDefPtr dev)
}
static int
libxlDomainUpdateDeviceLive(libxlDomainObjPrivatePtr priv,
virDomainObjPtr vm, virDomainDeviceDefPtr dev)
libxlDomainUpdateDeviceLive(virDomainObjPtr vm, virDomainDeviceDefPtr dev)
{
virDomainDiskDefPtr disk;
int ret = -1;
@ -3414,7 +3413,7 @@ libxlDomainUpdateDeviceLive(libxlDomainObjPrivatePtr priv,
disk = dev->data.disk;
switch (disk->device) {
case VIR_DOMAIN_DISK_DEVICE_CDROM:
ret = libxlDomainChangeEjectableMedia(priv, vm, disk);
ret = libxlDomainChangeEjectableMedia(vm, disk);
if (ret == 0)
dev->data.disk = NULL;
break;
@ -3487,7 +3486,6 @@ libxlDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
virDomainObjPtr vm = NULL;
virDomainDefPtr vmdef = NULL;
virDomainDeviceDefPtr dev = NULL;
libxlDomainObjPrivatePtr priv;
int ret = -1;
virCheckFlags(VIR_DOMAIN_DEVICE_MODIFY_LIVE |
@ -3522,8 +3520,6 @@ libxlDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
goto endjob;
}
priv = vm->privateData;
if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
if (!(dev = virDomainDeviceDefParse(xml, vm->def,
cfg->caps, driver->xmlopt,
@ -3547,7 +3543,7 @@ libxlDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
VIR_DOMAIN_DEF_PARSE_INACTIVE)))
goto endjob;
if (libxlDomainAttachDeviceLive(driver, priv, vm, dev) < 0)
if (libxlDomainAttachDeviceLive(driver, vm, dev) < 0)
goto endjob;
/*
@ -3598,7 +3594,6 @@ libxlDomainDetachDeviceFlags(virDomainPtr dom, const char *xml,
virDomainObjPtr vm = NULL;
virDomainDefPtr vmdef = NULL;
virDomainDeviceDefPtr dev = NULL;
libxlDomainObjPrivatePtr priv;
int ret = -1;
virCheckFlags(VIR_DOMAIN_DEVICE_MODIFY_LIVE |
@ -3633,8 +3628,6 @@ libxlDomainDetachDeviceFlags(virDomainPtr dom, const char *xml,
goto endjob;
}
priv = vm->privateData;
if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
if (!(dev = virDomainDeviceDefParse(xml, vm->def,
cfg->caps, driver->xmlopt,
@ -3658,7 +3651,7 @@ libxlDomainDetachDeviceFlags(virDomainPtr dom, const char *xml,
VIR_DOMAIN_DEF_PARSE_INACTIVE)))
goto endjob;
if (libxlDomainDetachDeviceLive(driver, priv, vm, dev) < 0)
if (libxlDomainDetachDeviceLive(driver, vm, dev) < 0)
goto endjob;
/*
@ -3709,7 +3702,6 @@ libxlDomainUpdateDeviceFlags(virDomainPtr dom, const char *xml,
virDomainObjPtr vm = NULL;
virDomainDefPtr vmdef = NULL;
virDomainDeviceDefPtr dev = NULL;
libxlDomainObjPrivatePtr priv;
int ret = -1;
virCheckFlags(VIR_DOMAIN_DEVICE_MODIFY_LIVE |
@ -3741,8 +3733,6 @@ libxlDomainUpdateDeviceFlags(virDomainPtr dom, const char *xml,
goto cleanup;
}
priv = vm->privateData;
if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
if (!(dev = virDomainDeviceDefParse(xml, vm->def,
cfg->caps, driver->xmlopt,
@ -3768,7 +3758,7 @@ libxlDomainUpdateDeviceFlags(virDomainPtr dom, const char *xml,
VIR_DOMAIN_DEF_PARSE_INACTIVE)))
goto cleanup;
if ((ret = libxlDomainUpdateDeviceLive(priv, vm, dev)) < 0)
if ((ret = libxlDomainUpdateDeviceLive(vm, dev)) < 0)
goto cleanup;
/*
@ -4002,7 +3992,8 @@ libxlDomainSetAutostart(virDomainPtr dom, int autostart)
static char *
libxlDomainGetSchedulerType(virDomainPtr dom, int *nparams)
{
libxlDomainObjPrivatePtr priv;
libxlDriverPrivatePtr driver = dom->conn->privateData;
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
virDomainObjPtr vm;
char * ret = NULL;
const char *name = NULL;
@ -4019,8 +4010,7 @@ libxlDomainGetSchedulerType(virDomainPtr dom, int *nparams)
goto cleanup;
}
priv = vm->privateData;
sched_id = libxl_get_scheduler(priv->ctx);
sched_id = libxl_get_scheduler(cfg->ctx);
if (nparams)
*nparams = 0;
@ -4051,6 +4041,7 @@ libxlDomainGetSchedulerType(virDomainPtr dom, int *nparams)
cleanup:
if (vm)
virObjectUnlock(vm);
virObjectUnref(cfg);
return ret;
}
@ -4060,7 +4051,8 @@ libxlDomainGetSchedulerParametersFlags(virDomainPtr dom,
int *nparams,
unsigned int flags)
{
libxlDomainObjPrivatePtr priv;
libxlDriverPrivatePtr driver = dom->conn->privateData;
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
virDomainObjPtr vm;
libxl_domain_sched_params sc_info;
libxl_scheduler sched_id;
@ -4083,9 +4075,7 @@ libxlDomainGetSchedulerParametersFlags(virDomainPtr dom,
goto cleanup;
}
priv = vm->privateData;
sched_id = libxl_get_scheduler(priv->ctx);
sched_id = libxl_get_scheduler(cfg->ctx);
if (sched_id != LIBXL_SCHEDULER_CREDIT) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@ -4093,7 +4083,7 @@ libxlDomainGetSchedulerParametersFlags(virDomainPtr dom,
goto cleanup;
}
if (libxl_domain_sched_params_get(priv->ctx, vm->def->id, &sc_info) != 0) {
if (libxl_domain_sched_params_get(cfg->ctx, vm->def->id, &sc_info) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to get scheduler parameters for domain '%d'"
" with libxenlight"), vm->def->id);
@ -4117,6 +4107,7 @@ libxlDomainGetSchedulerParametersFlags(virDomainPtr dom,
cleanup:
if (vm)
virObjectUnlock(vm);
virObjectUnref(cfg);
return ret;
}
@ -4134,7 +4125,7 @@ libxlDomainSetSchedulerParametersFlags(virDomainPtr dom,
unsigned int flags)
{
libxlDriverPrivatePtr driver = dom->conn->privateData;
libxlDomainObjPrivatePtr priv;
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
virDomainObjPtr vm;
libxl_domain_sched_params sc_info;
int sched_id;
@ -4164,9 +4155,7 @@ libxlDomainSetSchedulerParametersFlags(virDomainPtr dom,
goto endjob;
}
priv = vm->privateData;
sched_id = libxl_get_scheduler(priv->ctx);
sched_id = libxl_get_scheduler(cfg->ctx);
if (sched_id != LIBXL_SCHEDULER_CREDIT) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@ -4174,7 +4163,7 @@ libxlDomainSetSchedulerParametersFlags(virDomainPtr dom,
goto endjob;
}
if (libxl_domain_sched_params_get(priv->ctx, vm->def->id, &sc_info) != 0) {
if (libxl_domain_sched_params_get(cfg->ctx, vm->def->id, &sc_info) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to get scheduler parameters for domain '%d'"
" with libxenlight"), vm->def->id);
@ -4190,7 +4179,7 @@ libxlDomainSetSchedulerParametersFlags(virDomainPtr dom,
sc_info.cap = params[i].value.ui;
}
if (libxl_domain_sched_params_set(priv->ctx, vm->def->id, &sc_info) != 0) {
if (libxl_domain_sched_params_set(cfg->ctx, vm->def->id, &sc_info) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to set scheduler parameters for domain '%d'"
" with libxenlight"), vm->def->id);
@ -4206,6 +4195,7 @@ libxlDomainSetSchedulerParametersFlags(virDomainPtr dom,
cleanup:
if (vm)
virObjectUnlock(vm);
virObjectUnref(cfg);
return ret;
}
@ -4299,7 +4289,8 @@ libxlDomainGetNumaParameters(virDomainPtr dom,
int *nparams,
unsigned int flags)
{
libxlDomainObjPrivatePtr priv;
libxlDriverPrivatePtr driver = dom->conn->privateData;
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
virDomainObjPtr vm;
libxl_bitmap nodemap;
virBitmapPtr nodes = NULL;
@ -4330,8 +4321,6 @@ libxlDomainGetNumaParameters(virDomainPtr dom,
goto cleanup;
}
priv = vm->privateData;
if ((*nparams) == 0) {
*nparams = LIBXL_NUMA_NPARAM;
ret = 0;
@ -4359,18 +4348,18 @@ libxlDomainGetNumaParameters(virDomainPtr dom,
/* Node affinity */
/* Let's allocate both libxl and libvirt bitmaps */
numnodes = libxl_get_max_nodes(priv->ctx);
numnodes = libxl_get_max_nodes(cfg->ctx);
if (numnodes <= 0)
goto cleanup;
if (libxl_node_bitmap_alloc(priv->ctx, &nodemap, 0)) {
if (libxl_node_bitmap_alloc(cfg->ctx, &nodemap, 0)) {
virReportOOMError();
goto cleanup;
}
if (!(nodes = virBitmapNew(numnodes)))
goto cleanup;
rc = libxl_domain_get_nodeaffinity(priv->ctx,
rc = libxl_domain_get_nodeaffinity(cfg->ctx,
vm->def->id,
&nodemap);
if (rc != 0) {
@ -4413,6 +4402,7 @@ libxlDomainGetNumaParameters(virDomainPtr dom,
libxl_bitmap_dispose(&nodemap);
if (vm)
virObjectUnlock(vm);
virObjectUnref(cfg);
return ret;
}
#endif

View File

@ -1,7 +1,7 @@
/*
* libxl_migration.c: methods for handling migration with libxenlight
*
* Copyright (C) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
* Copyright (C) 2014-2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@ -176,7 +176,6 @@ libxlDoMigrateSend(libxlDriverPrivatePtr driver,
unsigned long flags,
int sockfd)
{
libxlDomainObjPrivatePtr priv;
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
virObjectEventPtr event = NULL;
int xl_flags = 0;
@ -185,12 +184,11 @@ libxlDoMigrateSend(libxlDriverPrivatePtr driver,
if (flags & VIR_MIGRATE_LIVE)
xl_flags = LIBXL_SUSPEND_LIVE;
priv = vm->privateData;
ret = libxl_domain_suspend(priv->ctx, vm->def->id, sockfd,
ret = libxl_domain_suspend(cfg->ctx, vm->def->id, sockfd,
xl_flags, NULL);
if (ret != 0) {
/* attempt to resume the domain on failure */
if (libxl_domain_resume(priv->ctx, vm->def->id, 1, 0) != 0) {
if (libxl_domain_resume(cfg->ctx, vm->def->id, 1, 0) != 0) {
VIR_DEBUG("Failed to resume domain following failed migration");
virDomainObjSetState(vm, VIR_DOMAIN_PAUSED,
VIR_DOMAIN_PAUSED_MIGRATION);
@ -547,7 +545,7 @@ libxlDomainMigrationFinish(virConnectPtr dconn,
/* Unpause if requested */
if (!(flags & VIR_MIGRATE_PAUSED)) {
if (libxl_domain_unpause(priv->ctx, vm->def->id) != 0) {
if (libxl_domain_unpause(cfg->ctx, vm->def->id) != 0) {
virReportError(VIR_ERR_OPERATION_FAILED, "%s",
_("Failed to unpause domain"));
goto cleanup;
@ -577,7 +575,7 @@ libxlDomainMigrationFinish(virConnectPtr dconn,
cleanup:
if (dom == NULL) {
libxl_domain_destroy(priv->ctx, vm->def->id, NULL);
libxl_domain_destroy(cfg->ctx, vm->def->id, NULL);
libxlDomainCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED);
event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_FAILED);
@ -598,12 +596,11 @@ libxlDomainMigrationConfirm(libxlDriverPrivatePtr driver,
int cancelled)
{
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
libxlDomainObjPrivatePtr priv = vm->privateData;
virObjectEventPtr event = NULL;
int ret = -1;
if (cancelled) {
if (libxl_domain_resume(priv->ctx, vm->def->id, 1, 0) == 0) {
if (libxl_domain_resume(cfg->ctx, vm->def->id, 1, 0) == 0) {
ret = 0;
} else {
VIR_DEBUG("Unable to resume domain '%s' after failed migration",
@ -617,7 +614,7 @@ libxlDomainMigrationConfirm(libxlDriverPrivatePtr driver,
goto cleanup;
}
libxl_domain_destroy(priv->ctx, vm->def->id, NULL);
libxl_domain_destroy(cfg->ctx, vm->def->id, NULL);
libxlDomainCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_MIGRATED);
event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_MIGRATED);