[libvirt] PATCH: 7/28: Thread safety for QEMU driver

Daniel Veillard veillard at redhat.com
Tue Dec 2 09:45:32 UTC 2008


On Sun, Nov 30, 2008 at 11:33:06PM +0000, Daniel P. Berrange wrote:
> This patch makes the QEMU driver threadsafe with the exception of the
> domain events code.
> @@ -229,20 +243,22 @@ qemudStartup(void) {
[...]
> +error:
> +    if (qemu_driver)
> +        qemuDriverUnlock(qemu_driver);
>      VIR_FREE(base);
> -    VIR_FREE(qemu_driver);
> +    qemudShutdown();

  okay the clean way to free the driver structure

> @@ -314,16 +334,16 @@ qemudShutdown(void) {
>      if (!qemu_driver)
>          return -1;
>  
> +    qemuDriverLock(qemu_driver);
>      virCapabilitiesFree(qemu_driver->caps);
>  
>      /* shutdown active VMs */
>      for (i = 0 ; i < qemu_driver->domains.count ; i++) {
>          virDomainObjPtr dom = qemu_driver->domains.objs[i];
> +        virDomainObjLock(dom);
>          if (virDomainIsActive(dom))
>              qemudShutdownVMDaemon(NULL, qemu_driver, dom);
> -        if (!dom->persistent)
> -            virDomainRemoveInactive(&qemu_driver->domains,
> -                                    dom);
> +        virDomainObjUnlock(dom);
>      }
>  
>      virDomainObjListFree(&qemu_driver->domains);
> @@ -340,6 +360,7 @@ qemudShutdown(void) {
>      if (qemu_driver->brctl)
>          brShutdown(qemu_driver->brctl);
>  
> +    qemuDriverUnlock(qemu_driver);
>      VIR_FREE(qemu_driver);
>  
>      return 0;

   We don't remove anymore the non-persistent domain on shutdown ?
Is that because we can hook this to the event lifecycle processing ?

> @@ -1089,18 +1087,38 @@ qemudDispatchVMEvent(int watch, int fd, 
[...]
> +    if (failed || quit) {
> +        qemudShutdownVMDaemon(NULL, driver, vm);
> +        qemudDomainEventDispatch(driver, vm,
> +                                 VIR_DOMAIN_EVENT_STOPPED,
> +                                 quit ?
> +                                 VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN :
> +                                 VIR_DOMAIN_EVENT_STOPPED_FAILED);
> +        if (!vm->persistent) {
> +            virDomainRemoveInactive(&driver->domains,
> +                                    vm);
> +            vm = NULL;
> +        }
> +    }

  seems to be done here now, okay

   I could not spot anything on the locking side, +1

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