From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53324) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VGpos-0007y0-62 for qemu-devel@nongnu.org; Tue, 03 Sep 2013 08:35:02 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VGpoj-0006cG-8J for qemu-devel@nongnu.org; Tue, 03 Sep 2013 08:34:54 -0400 Received: from mail-ea0-x230.google.com ([2a00:1450:4013:c01::230]:41848) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VGpoj-0006bw-1q for qemu-devel@nongnu.org; Tue, 03 Sep 2013 08:34:45 -0400 Received: by mail-ea0-f176.google.com with SMTP id q16so2962070ead.35 for ; Tue, 03 Sep 2013 05:34:44 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Tue, 3 Sep 2013 14:33:28 +0200 Message-Id: <1378211609-16121-38-git-send-email-pbonzini@redhat.com> In-Reply-To: <1378211609-16121-1-git-send-email-pbonzini@redhat.com> References: <1378211609-16121-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 37/38] xen_pt: reclaim memory in instance_finalize instead of exit List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: mst@redhat.com Signed-off-by: Paolo Bonzini --- hw/xen/xen_pt.c | 10 ++++++++++ hw/xen/xen_pt_config_init.c | 3 --- hw/xen/xen_pt_msi.c | 8 +++++++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/hw/xen/xen_pt.c b/hw/xen/xen_pt.c index ca2d460..592c472 100644 --- a/hw/xen/xen_pt.c +++ b/hw/xen/xen_pt.c @@ -806,7 +806,16 @@ static void xen_pt_unregister_device(PCIDevice *d) } } + xen_pt_msix_delete(s); +} + +static void xen_pt_instance_finalize(Object *obj) +{ + PCIDevice *d = PCI_DEVICE(obj); + XenPCIPassthroughState *s = DO_UPCAST(XenPCIPassthroughState, dev, d); + /* delete all emulated config registers */ + xen_pt_msix_free(s); xen_pt_config_delete(s); xen_pt_unregister_regions(s); @@ -840,6 +849,7 @@ static const TypeInfo xen_pci_passthrough_info = { .parent = TYPE_PCI_DEVICE, .instance_size = sizeof(XenPCIPassthroughState), .class_init = xen_pci_passthrough_class_init, + .instance_finalize = xen_pt_instance_finalize, }; static void xen_pci_passthrough_register_types(void) diff --git a/hw/xen/xen_pt_config_init.c b/hw/xen/xen_pt_config_init.c index 8ccc2e4..25f6334 100644 --- a/hw/xen/xen_pt_config_init.c +++ b/hw/xen/xen_pt_config_init.c @@ -1861,9 +1861,6 @@ void xen_pt_config_delete(XenPCIPassthroughState *s) struct XenPTReg *reg, *next_reg; /* free MSI/MSI-X info table */ - if (s->msix) { - xen_pt_msix_delete(s); - } if (s->msi) { g_free(s->msi); } diff --git a/hw/xen/xen_pt_msi.c b/hw/xen/xen_pt_msi.c index 6fbe0cc..5bcbbf2 100644 --- a/hw/xen/xen_pt_msi.c +++ b/hw/xen/xen_pt_msi.c @@ -605,6 +605,13 @@ void xen_pt_msix_delete(XenPCIPassthroughState *s) return; } + memory_region_del_subregion(&s->bar[msix->bar_index], &msix->mmio); +} + +void xen_pt_msix_free(XenPCIPassthroughState *s) +{ + XenPTMSIX *msix = s->msix; + /* unmap the MSI-X memory mapped register area */ if (msix->phys_iomem_base) { XEN_PT_LOG(&s->dev, "unmapping physical MSI-X table from %p\n", @@ -613,7 +620,6 @@ void xen_pt_msix_delete(XenPCIPassthroughState *s) + msix->table_offset_adjust); } - memory_region_del_subregion(&s->bar[msix->bar_index], &msix->mmio); memory_region_destroy(&msix->mmio); g_free(s->msix); -- 1.8.3.1