Fix blatant issue where we leave a freed assigned device node on
the list if irq assignment fails.
Signed-off-by: Mark McLoughlin <[EMAIL PROTECTED]>
---
qemu/hw/device-assignment.c | 15 ++++++++++-----
1 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/qemu/hw/device-assignment.c b/qemu/hw/device-assignment.c
index b39617a..fde17ac 100644
--- a/qemu/hw/device-assignment.c
+++ b/qemu/hw/device-assignment.c
@@ -449,12 +449,14 @@ static uint32_t calc_assigned_dev_id(uint8_t bus, uint8_t
devfn)
*/
void assigned_dev_update_irq(PCIDevice *d)
{
- int irq, r;
- AssignedDevice *assigned_dev;
AssignedDevInfo *adev;
- LIST_FOREACH(adev, &adev_head, next) {
- assigned_dev = adev->assigned_dev;
+ adev = LIST_FIRST(&adev_head);
+ while (adev) {
+ AssignedDevInfo *next = LIST_NEXT(adev, next);
+ AssignedDevice *assigned_dev = adev->assigned_dev;
+ int irq, r;
+
irq = pci_map_irq(&assigned_dev->dev, assigned_dev->intpin);
irq = piix_get_irq(irq);
@@ -477,12 +479,15 @@ void assigned_dev_update_irq(PCIDevice *d)
adev->name, strerror(-r));
fprintf(stderr, "Perhaps you re you assigning a device "
"that shares IRQ with another device?\n");
+ LIST_REMOVE(adev, next);
pci_unregister_device(&assigned_dev->dev);
- /* FIXME: Delete node from list */
+ adev = next;
continue;
}
assigned_dev->girq = irq;
}
+
+ adev = next;
}
}
--
1.5.4.3
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html