1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-07 17:28:15 +00:00

libxl: use global libxl_ctx in event handler

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@suse.com>
This commit is contained in:
Jim Fehlig 2015-02-11 15:22:05 -07:00
parent 109cf8d89c
commit 0b0a3d63bb

View File

@ -356,6 +356,7 @@ virDomainDefParserConfig libxlDomainDefParserConfig = {
struct libxlShutdownThreadInfo struct libxlShutdownThreadInfo
{ {
libxlDriverPrivatePtr driver;
virDomainObjPtr vm; virDomainObjPtr vm;
libxl_event *event; libxl_event *event;
}; };
@ -366,15 +367,14 @@ libxlDomainShutdownThread(void *opaque)
{ {
struct libxlShutdownThreadInfo *shutdown_info = opaque; struct libxlShutdownThreadInfo *shutdown_info = opaque;
virDomainObjPtr vm = shutdown_info->vm; virDomainObjPtr vm = shutdown_info->vm;
libxlDomainObjPrivatePtr priv = vm->privateData;
libxl_event *ev = shutdown_info->event; libxl_event *ev = shutdown_info->event;
libxlDriverPrivatePtr driver = priv->driver; libxlDriverPrivatePtr driver = shutdown_info->driver;
libxl_ctx *ctx = priv->ctx;
virObjectEventPtr dom_event = NULL; virObjectEventPtr dom_event = NULL;
libxl_shutdown_reason xl_reason = ev->u.domain_shutdown.shutdown_reason; libxl_shutdown_reason xl_reason = ev->u.domain_shutdown.shutdown_reason;
virDomainShutoffReason reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN; virDomainShutoffReason reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN;
libxlDriverConfigPtr cfg;
virObjectLock(vm); cfg = libxlDriverConfigGet(driver);
if (xl_reason == LIBXL_SHUTDOWN_REASON_POWEROFF) { if (xl_reason == LIBXL_SHUTDOWN_REASON_POWEROFF) {
dom_event = virDomainEventLifecycleNewFromObj(vm, dom_event = virDomainEventLifecycleNewFromObj(vm,
@ -437,7 +437,7 @@ libxlDomainShutdownThread(void *opaque)
libxlDomainEventQueue(driver, dom_event); libxlDomainEventQueue(driver, dom_event);
dom_event = NULL; 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 (libxlDomainCleanupJob(driver, vm, reason)) {
if (!vm->persistent) { if (!vm->persistent) {
virDomainObjListRemove(driver->domains, vm); virDomainObjListRemove(driver->domains, vm);
@ -451,7 +451,7 @@ libxlDomainShutdownThread(void *opaque)
libxlDomainEventQueue(driver, dom_event); libxlDomainEventQueue(driver, dom_event);
dom_event = NULL; 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); libxlDomainCleanupJob(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN);
if (libxlDomainStart(driver, vm, false, -1) < 0) { if (libxlDomainStart(driver, vm, false, -1) < 0) {
virErrorPtr err = virGetLastError(); virErrorPtr err = virGetLastError();
@ -464,8 +464,9 @@ libxlDomainShutdownThread(void *opaque)
virObjectUnlock(vm); virObjectUnlock(vm);
if (dom_event) if (dom_event)
libxlDomainEventQueue(driver, dom_event); libxlDomainEventQueue(driver, dom_event);
libxl_event_free(ctx, ev); libxl_event_free(cfg->ctx, ev);
VIR_FREE(shutdown_info); VIR_FREE(shutdown_info);
virObjectUnref(cfg);
} }
/* /*
@ -474,11 +475,12 @@ libxlDomainShutdownThread(void *opaque)
void void
libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_CONST libxl_event *event) libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_CONST libxl_event *event)
{ {
virDomainObjPtr vm = data; libxlDriverPrivatePtr driver = data;
libxlDomainObjPrivatePtr priv = vm->privateData; virDomainObjPtr vm = NULL;
libxl_shutdown_reason xl_reason = event->u.domain_shutdown.shutdown_reason; libxl_shutdown_reason xl_reason = event->u.domain_shutdown.shutdown_reason;
struct libxlShutdownThreadInfo *shutdown_info; struct libxlShutdownThreadInfo *shutdown_info;
virThread thread; virThread thread;
libxlDriverConfigPtr cfg;
if (event->type != LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN) { if (event->type != LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN) {
VIR_INFO("Unhandled event type %d", event->type); VIR_INFO("Unhandled event type %d", event->type);
@ -492,6 +494,12 @@ libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_CONST libxl_event *event)
if (xl_reason == LIBXL_SHUTDOWN_REASON_SUSPEND) if (xl_reason == LIBXL_SHUTDOWN_REASON_SUSPEND)
goto error; 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 * Start a thread to handle shutdown. We don't want to be tying up
* libxl's event machinery by doing a potentially lengthy shutdown. * libxl's event machinery by doing a potentially lengthy shutdown.
@ -499,7 +507,8 @@ libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_CONST libxl_event *event)
if (VIR_ALLOC(shutdown_info) < 0) if (VIR_ALLOC(shutdown_info) < 0)
goto error; goto error;
shutdown_info->vm = data; shutdown_info->driver = driver;
shutdown_info->vm = vm;
shutdown_info->event = (libxl_event *)event; shutdown_info->event = (libxl_event *)event;
if (virThreadCreate(&thread, false, libxlDomainShutdownThread, if (virThreadCreate(&thread, false, libxlDomainShutdownThread,
shutdown_info) < 0) { shutdown_info) < 0) {
@ -511,13 +520,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; return;
error: error:
cfg = libxlDriverConfigGet(driver);
/* Cast away any const */ /* 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 int