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

Chris Lalancette clalance at redhat.com
Mon Feb 1 15:15:22 UTC 2010


On 02/01/2010 10:13 AM, Daniel Veillard wrote:
>> 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 !

Thanks, pushed.

-- 
Chris Lalancette




More information about the libvir-list mailing list