]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Fix HAL driver restart thread safety
authorDaniel P. Berrange <berrange@redhat.com>
Wed, 3 Jun 2009 11:24:21 +0000 (11:24 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Wed, 3 Jun 2009 11:24:21 +0000 (11:24 +0000)
ChangeLog
src/node_device.c
src/node_device_hal.c

index 5263b4479e83fba46862b1a969cf1b8899404f74..7cda4df2b135359c729b880d5d7232515e7f459f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Wed Jun  3 12:19:52 BST 2009 Daniel P. Berrange <berrange@redhat.com>
+
+       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 <berrange@redhat.com>
 
        Support networking in UML driver
index 2cdf5b3adb5e2853fe48b321f3bf7f66c64c625e..cd9fb6e65fe7238ff86c8d5c5203b1ab0637afaf 100644 (file)
@@ -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);
 }
 
index 0fd7e886e5cf4ebf6ef17e7c8fa79f417c677ce3..54effc04197b85696f2480f1ba2622ba3953f51b 100644 (file)
@@ -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;
 }