On Thu, Nov 12, 2009 at 03:00:48PM +0000, Daniel P. Berrange wrote: > There is a race condition in HAL driver startup where the callback > can get triggered before we have finished startup. This then causes > a deadlock in the driver. > > * src/node_device/node_device_hal.c: RElease driver lock before > registering DBus callbacks > --- > src/node_device/node_device_hal.c | 14 ++++++++++---- > 1 files changed, 10 insertions(+), 4 deletions(-) > > diff --git a/src/node_device/node_device_hal.c b/src/node_device/node_device_hal.c > index 818c7d6..918a3a9 100644 > --- a/src/node_device/node_device_hal.c > +++ b/src/node_device/node_device_hal.c > @@ -742,6 +742,16 @@ static int halDeviceMonitorStartup(int privileged ATTRIBUTE_UNUSED) > goto failure; > } > > + /* Populate with known devices */ > + driverState->privateData = hal_ctx; > + > + /* We need to unlock state now, since setting these callbacks cause > + * a dbus RPC call, and while this call is waiting for the reply, > + * a signal may already arrive, triggering the callback and thus > + * requiring the lock ! > + */ > + nodeDeviceUnlock(driverState); > + > /* Register HAL event callbacks */ > if (!libhal_ctx_set_device_added(hal_ctx, device_added) || > !libhal_ctx_set_device_removed(hal_ctx, device_removed) || > @@ -753,10 +763,6 @@ static int halDeviceMonitorStartup(int privileged ATTRIBUTE_UNUSED) > goto failure; > } > > - /* Populate with known devices */ > - driverState->privateData = hal_ctx; > - > - nodeDeviceUnlock(driverState); > udi = libhal_get_all_devices(hal_ctx, &num_devs, &err); > if (udi == NULL) { > VIR_ERROR0("libhal_get_all_devices failed\n"); Tricky, ACK, Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list