[libvirt] [PATCH 2/5] Fix race condition in HAL driver startup

Daniel Veillard veillard at redhat.com
Fri Nov 13 09:26:53 UTC 2009


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 at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list