diff --git a/ChangeLog b/ChangeLog index 5263b4479e..7cda4df2b1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Wed Jun 3 12:19:52 BST 2009 Daniel P. Berrange + + Fix HAL driver restart thread safety + * src/node_device_hal.c: Only clear & recreate device objects, + not entire driver struct. + * src/node_device.c: Remove overly verbose logging of mutex + operations. + Wed Jun 3 12:03:52 BST 2009 Daniel P. Berrange Support networking in UML driver diff --git a/src/node_device.c b/src/node_device.c index 2cdf5b3adb..cd9fb6e65f 100644 --- a/src/node_device.c +++ b/src/node_device.c @@ -51,12 +51,10 @@ static int dev_has_cap(const virNodeDeviceObjPtr dev, const char *cap) void nodeDeviceLock(virDeviceMonitorStatePtr driver) { - DEBUG("LOCK node %p", driver); virMutexLock(&driver->lock); } void nodeDeviceUnlock(virDeviceMonitorStatePtr driver) { - DEBUG("UNLOCK node %p", driver); virMutexUnlock(&driver->lock); } diff --git a/src/node_device_hal.c b/src/node_device_hal.c index 0fd7e886e5..54effc0419 100644 --- a/src/node_device_hal.c +++ b/src/node_device_hal.c @@ -800,10 +800,33 @@ static int halDeviceMonitorShutdown(void) static int halDeviceMonitorReload(void) { - /* XXX This isn't thread safe because its free'ing the thing - * we're locking */ - (void)halDeviceMonitorShutdown(); - return halDeviceMonitorStartup(); + DBusError err; + char **udi = NULL; + int num_devs, i; + LibHalContext *hal_ctx; + + VIR_INFO0("Reloading HAL device state"); + nodeDeviceLock(driverState); + VIR_INFO0("Removing existing objects"); + virNodeDeviceObjListFree(&driverState->devs); + nodeDeviceUnlock(driverState); + + hal_ctx = DRV_STATE_HAL_CTX(driverState); + VIR_INFO0("Creating new objects"); + dbus_error_init(&err); + udi = libhal_get_all_devices(hal_ctx, &num_devs, &err); + if (udi == NULL) { + fprintf(stderr, "%s: libhal_get_all_devices failed\n", __FUNCTION__); + return -1; + } + for (i = 0; i < num_devs; i++) { + dev_create(udi[i]); + VIR_FREE(udi[i]); + } + VIR_FREE(udi); + VIR_INFO0("HAL device reload complete"); + + return 0; }