Change the domain event handler code to use the driver-wide
libxl_ctx instead of the domain-specific one.
Signed-off-by: Jim Fehlig <jfehlig(a)suse.com>
---
src/libxl/libxl_domain.c | 37 +++++++++++++++++++++++++------------
1 file changed, 25 insertions(+), 12 deletions(-)
diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
index 73bd5d0..ea3276c 100644
--- a/src/libxl/libxl_domain.c
+++ b/src/libxl/libxl_domain.c
@@ -349,6 +349,7 @@ virDomainDefParserConfig libxlDomainDefParserConfig = {
struct libxlShutdownThreadInfo
{
+ libxlDriverPrivatePtr driver;
virDomainObjPtr vm;
libxl_event *event;
};
@@ -359,15 +360,14 @@ libxlDomainShutdownThread(void *opaque)
{
struct libxlShutdownThreadInfo *shutdown_info = opaque;
virDomainObjPtr vm = shutdown_info->vm;
- libxlDomainObjPrivatePtr priv = vm->privateData;
libxl_event *ev = shutdown_info->event;
- libxlDriverPrivatePtr driver = priv->driver;
- libxl_ctx *ctx = priv->ctx;
+ libxlDriverPrivatePtr driver = shutdown_info->driver;
virObjectEventPtr dom_event = NULL;
libxl_shutdown_reason xl_reason = ev->u.domain_shutdown.shutdown_reason;
virDomainShutoffReason reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN;
+ libxlDriverConfigPtr cfg;
- virObjectLock(vm);
+ cfg = libxlDriverConfigGet(driver);
if (xl_reason == LIBXL_SHUTDOWN_REASON_POWEROFF) {
dom_event = virDomainEventLifecycleNewFromObj(vm,
@@ -430,7 +430,7 @@ libxlDomainShutdownThread(void *opaque)
libxlDomainEventQueue(driver, dom_event);
dom_event = NULL;
}
- libxl_domain_destroy(ctx, vm->def->id, NULL);
+ libxl_domain_destroy(cfg->ctx, vm->def->id, NULL);
if (libxlDomainCleanupJob(driver, vm, reason)) {
if (!vm->persistent) {
virDomainObjListRemove(driver->domains, vm);
@@ -444,7 +444,7 @@ libxlDomainShutdownThread(void *opaque)
libxlDomainEventQueue(driver, dom_event);
dom_event = NULL;
}
- libxl_domain_destroy(ctx, vm->def->id, NULL);
+ libxl_domain_destroy(cfg->ctx, vm->def->id, NULL);
libxlDomainCleanupJob(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN);
if (libxlDomainStart(driver, vm, false, -1) < 0) {
virErrorPtr err = virGetLastError();
@@ -457,8 +457,9 @@ libxlDomainShutdownThread(void *opaque)
virObjectUnlock(vm);
if (dom_event)
libxlDomainEventQueue(driver, dom_event);
- libxl_event_free(ctx, ev);
+ libxl_event_free(cfg->ctx, ev);
VIR_FREE(shutdown_info);
+ virObjectUnref(cfg);
}
/*
@@ -467,11 +468,12 @@ libxlDomainShutdownThread(void *opaque)
void
libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_CONST libxl_event *event)
{
- virDomainObjPtr vm = data;
- libxlDomainObjPrivatePtr priv = vm->privateData;
+ libxlDriverPrivatePtr driver = data;
+ virDomainObjPtr vm = NULL;
libxl_shutdown_reason xl_reason = event->u.domain_shutdown.shutdown_reason;
struct libxlShutdownThreadInfo *shutdown_info;
virThread thread;
+ libxlDriverConfigPtr cfg;
if (event->type != LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN) {
VIR_INFO("Unhandled event type %d", event->type);
@@ -485,6 +487,12 @@ libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_CONST libxl_event
*event)
if (xl_reason == LIBXL_SHUTDOWN_REASON_SUSPEND)
goto error;
+ vm = virDomainObjListFindByID(driver->domains, event->domid);
+ if (!vm) {
+ VIR_INFO("Received event for unknown domain ID %d", event->domid);
+ goto error;
+ }
+
/*
* Start a thread to handle shutdown. We don't want to be tying up
* libxl's event machinery by doing a potentially lengthy shutdown.
@@ -492,7 +500,8 @@ libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_CONST libxl_event
*event)
if (VIR_ALLOC(shutdown_info) < 0)
goto error;
- shutdown_info->vm = data;
+ shutdown_info->driver = driver;
+ shutdown_info->vm = vm;
shutdown_info->event = (libxl_event *)event;
if (virThreadCreate(&thread, false, libxlDomainShutdownThread,
shutdown_info) < 0) {
@@ -504,13 +513,17 @@ libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_CONST
libxl_event *event)
}
/*
- * libxl_event freed in shutdown thread
+ * VM is unlocked and libxl_event freed in shutdown thread
*/
return;
error:
+ cfg = libxlDriverConfigGet(driver);
/* Cast away any const */
- libxl_event_free(priv->ctx, (libxl_event *)event);
+ libxl_event_free(cfg->ctx, (libxl_event *)event);
+ virObjectUnref(cfg);
+ if (vm)
+ virObjectUnlock(vm);
}
int
--
1.8.4.5