[libvirt] [PATCH] Fix PCI host reattach on domain detach.

Daniel Veillard veillard at redhat.com
Mon Feb 1 15:13:23 UTC 2010


On Wed, Jan 27, 2010 at 09:23:51AM -0500, Chris Lalancette wrote:
> Similar to the race fixed by
> be34c3c7efbb1ea8999530f98b99c5dde3793f84, make sure
> to wait around for KVM to release the resources from
> a hot-detached PCI device before attempting to
> rebind that device to the host driver.
> 
> Signed-off-by: Chris Lalancette <clalance at redhat.com>
> ---
>  src/qemu/qemu_driver.c |   39 +++++++++++++++++++++++----------------
>  1 files changed, 23 insertions(+), 16 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index bbdbe33..5bf6743 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -2240,6 +2240,26 @@ cleanup:
>  }
>  
>  static void
> +qemudReattachManagedDevice(pciDevice *dev)
> +{
> +    int retries = 100;
> +
> +    if (pciDeviceGetManaged(dev)) {
> +        while (pciWaitForDeviceCleanup(dev, "kvm_assigned_device")
> +               && retries) {
> +            usleep(100*1000);
> +            retries--;
> +        }
> +        if (pciReAttachDevice(NULL, dev) < 0) {
> +            virErrorPtr err = virGetLastError();
> +            VIR_ERROR(_("Failed to re-attach PCI device: %s"),
> +                      err ? err->message : "");
> +            virResetError(err);
> +        }
> +    }
> +}
> +
> +static void
>  qemuDomainReAttachHostDevices(virConnectPtr conn,
>                                struct qemud_driver *driver,
>                                virDomainDefPtr def)
> @@ -2279,20 +2299,7 @@ qemuDomainReAttachHostDevices(virConnectPtr conn,
>  
>      for (i = 0; i < pciDeviceListCount(pcidevs); i++) {
>          pciDevice *dev = pciDeviceListGet(pcidevs, i);
> -        int retries = 100;
> -        if (pciDeviceGetManaged(dev)) {
> -            while (pciWaitForDeviceCleanup(dev, "kvm_assigned_device")
> -                   && retries) {
> -                usleep(100*1000);
> -                retries--;
> -            }
> -            if (pciReAttachDevice(NULL, dev) < 0) {
> -                virErrorPtr err = virGetLastError();
> -                VIR_ERROR(_("Failed to re-attach PCI device: %s"),
> -                          err ? err->message : "");
> -                virResetError(err);
> -            }
> -        }
> +        qemudReattachManagedDevice(dev);
>      }
>  
>      pciDeviceListFree(conn, pcidevs);
> @@ -6128,11 +6135,11 @@ static int qemudDomainDetachHostPciDevice(virConnectPtr conn,
>      if (!pci)
>          ret = -1;
>      else {
> +        pciDeviceSetManaged(pci, detach->managed);
>          pciDeviceListDel(conn, driver->activePciHostdevs, pci);
>          if (pciResetDevice(conn, pci, driver->activePciHostdevs) < 0)
>              ret = -1;
> -        if (detach->managed && pciReAttachDevice(conn, pci) < 0)
> -            ret = -1;
> +        qemudReattachManagedDevice(pci);
>          pciFreeDevice(conn, pci);
>      }
>  

  ACK, good to make a function for this !

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