From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mark McLoughlin Subject: [PATCH 07/12] kvm: qemu: device-assignment: remove device if irq assignment fails Date: Fri, 28 Nov 2008 17:10:45 +0000 Message-ID: <1227892250-14386-7-git-send-email-markmc@redhat.com> References: <> <1227892250-14386-1-git-send-email-markmc@redhat.com> <1227892250-14386-2-git-send-email-markmc@redhat.com> <1227892250-14386-3-git-send-email-markmc@redhat.com> <1227892250-14386-4-git-send-email-markmc@redhat.com> <1227892250-14386-5-git-send-email-markmc@redhat.com> <1227892250-14386-6-git-send-email-markmc@redhat.com> Cc: kvm@vger.kernel.org, Mark McLoughlin To: Avi Kivity Return-path: Received: from mail07.svc.cra.dublin.eircom.net ([159.134.118.23]:34494 "HELO mail07.svc.cra.dublin.eircom.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1751448AbYK1RMI (ORCPT ); Fri, 28 Nov 2008 12:12:08 -0500 In-Reply-To: <1227892250-14386-6-git-send-email-markmc@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: Fix blatant issue where we leave a freed assigned device node on the list if irq assignment fails. Signed-off-by: Mark McLoughlin --- 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