From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mark McLoughlin Subject: [PATCH 08/12] kvm: qemu: device-assignment: introduce free_assigned_device() Date: Fri, 28 Nov 2008 17:10:46 +0000 Message-ID: <1227892250-14386-8-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> <1227892250-14386-7-git-send-email-markmc@redhat.com> Cc: kvm@vger.kernel.org, Mark McLoughlin To: Avi Kivity Return-path: Received: from mail00.svc.cra.dublin.eircom.net ([159.134.118.16]:33718 "HELO mail00.svc.cra.dublin.eircom.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1751334AbYK1RMH (ORCPT ); Fri, 28 Nov 2008 12:12:07 -0500 In-Reply-To: <1227892250-14386-7-git-send-email-markmc@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: Add a function to fully free the AssignedDevice and AssignedDevInfo and remove from the list. Signed-off-by: Mark McLoughlin --- qemu/hw/device-assignment.c | 16 ++++++++++++++-- qemu/hw/device-assignment.h | 1 + 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/qemu/hw/device-assignment.c b/qemu/hw/device-assignment.c index fde17ac..2836059 100644 --- a/qemu/hw/device-assignment.c +++ b/qemu/hw/device-assignment.c @@ -439,6 +439,19 @@ again: static LIST_HEAD(, AssignedDevInfo) adev_head; +void free_assigned_device(AssignedDevInfo *adev) +{ + AssignedDevice *dev = adev->assigned_dev; + + if (dev) { + pci_unregister_device(&dev->dev); + adev->assigned_dev = dev = NULL; + } + + LIST_REMOVE(adev, next); + qemu_free(adev); +} + static uint32_t calc_assigned_dev_id(uint8_t bus, uint8_t devfn) { return (uint32_t)bus << 8 | (uint32_t)devfn; @@ -479,8 +492,7 @@ 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); + free_assigned_device(adev); adev = next; continue; } diff --git a/qemu/hw/device-assignment.h b/qemu/hw/device-assignment.h index 5a01d98..c8c47d3 100644 --- a/qemu/hw/device-assignment.h +++ b/qemu/hw/device-assignment.h @@ -94,6 +94,7 @@ struct AssignedDevInfo { int disable_iommu; }; +void free_assigned_device(AssignedDevInfo *adev); PCIDevice *init_assigned_device(AssignedDevInfo *adev, PCIBus *bus); AssignedDevInfo *add_assigned_device(const char *arg); void add_assigned_devices(PCIBus *bus, const char **devices, int n_devices); -- 1.5.4.3