[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