Am Donnerstag 10 März 2011 07:45:49 schrieb Jim Fehlig: > Add a new xen driver based on libxenlight [1], which is the primary > toolstack starting with Xen 4.1.0. The driver is stateful, runs > privileged only, and is accessed with libxl:/// URI. > > V5: > - Ensure events are unregistered when domain private data > is destroyed. Discovered and fixed by Markus Gross. > > V4: > - Handle restart of libvirtd, reconnecting to previously > started domains > - Rebased to current master > - Tested against Xen 4.1 RC7-pre (c/s 22961:c5d121fd35c0) > > V3: > - Reserve vnc port within driver when autoport=yes > > V2: > - Update to Xen 4.1 RC6-pre (c/s 22940:5a4710640f81) > - Rebased to current master > - Plug memory leaks found by Stefano Stabellini and valgrind > - Handle SHUTDOWN_crash domain death event > > [1] > http://lists.xensource.com/archives/html/xen-devel/2009-11/msg00436.html The libxlEventHandler needs to hold an extra reference to the corresponding "vm" object. Otherwise the handler will try to access an invalid vm object under certain race conditions. I fixed it using the following patch. Now the libxl driver keeps an extra reference of the vm object for the event handler and specifies a free callback function. This free callback function removes the reference to the vm object to avoid a memory leak. diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 7559949..30f3700 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -235,6 +235,14 @@ cleanup: libxl_free_event(&event); } +static void +libxlDomainUnwatch(void *data) +{ + virDomainObjPtr vm = data; + /* Remove reference from handler */ + virDomainObjUnref(vm); +} + /* * Register domain events with libxenlight and insert event handles * in libvirt's event loop. @@ -257,17 +265,20 @@ libxlCreateDomEvents(virDomainObjPtr vm) if (fd < 0) goto error; + /* Hold an extra reference for the event handler */ + virDomainObjRef(vm); priv->waiterFD = fd; if ((priv->eventHdl = virEventAddHandle( fd, VIR_EVENT_HANDLE_READABLE | VIR_EVENT_HANDLE_ERROR, libxlEventHandler, - vm, NULL)) < 0) + vm, libxlDomainUnwatch)) < 0) goto error; return 0; error: + virDomainObjUnref(vm); libxl_free_waiter(priv->dWaiter); VIR_FREE(priv->dWaiter); priv->eventHdl = -1; -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list