[libvirt] [PATCH] qemu: Fix race between device rebind and kvm cleanup

Chris Lalancette clalance at redhat.com
Fri Jan 22 15:37:24 UTC 2010


On 01/22/2010 04:24 AM, Daniel Veillard wrote:
>> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
>> index c912d81..e42c090 100644
>> --- a/src/libvirt_private.syms
>> +++ b/src/libvirt_private.syms
...
>> @@ -2277,12 +2278,18 @@ qemuDomainReAttachHostDevices(virConnectPtr conn,
>>  
>>      for (i = 0; i < pciDeviceListCount(pcidevs); i++) {
>>          pciDevice *dev = pciDeviceListGet(pcidevs, i);
>> -        if (pciDeviceGetManaged(dev) &&
>> -            pciReAttachDevice(NULL, dev) < 0) {
>> -            virErrorPtr err = virGetLastError();
>> -            VIR_ERROR(_("Failed to re-attach PCI device: %s"),
>> -                      err ? err->message : "");
>> -            virResetError(err);
>> +        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);
>> +            }
>>          }
>>      }
> 
>   Okay so the maximum retries number for the whole set of managed
> devices is 100, not 100 per device (as retries is not incremented in the
> pci device loop) so the longuest we may wait is 10ms as a result
> whatever the number of devices, that's the intent, right ?

Actually, no, I meant to wait per-device; thanks for point out the bug.
Incidentally, the timeout is 10 seconds, not ms.  Updated patch with
per-device retries coming up.

-- 
Chris Lalancette




More information about the libvir-list mailing list