From a11ae9376d5d49e3be52429b4f361ee4abfbf2d8 Mon Sep 17 00:00:00 2001 From: Weidong Han <weidong.han@intel.com> Date: Fri, 6 Feb 2009 16:05:52 +0800 Subject: [PATCH 2/4] [backport] kvm: qemu: fix leak of ioperm data implement kvm_remove_ioperm_data to free ioperm data, and call it in free_assigned_device to avoid leak. [ehabkost: qemu-kvm.h conflict fixes] Signed-off-by: Weidong Han <weidong.han@intel.com> Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> Acked-by: Mark McLoughlin <markmc@redhat.com> Acked-by: Donald Dutile <ddutile@redhat.com> Bugzilla: 485318 --- qemu/hw/device-assignment.c | 2 ++ qemu/qemu-kvm.c | 17 +++++++++++++++++ qemu/qemu-kvm.h | 1 + 3 files changed, 20 insertions(+), 0 deletions(-) diff --git a/qemu/hw/device-assignment.c b/qemu/hw/device-assignment.c index c938d72..916029b 100644 --- a/qemu/hw/device-assignment.c +++ b/qemu/hw/device-assignment.c @@ -460,6 +460,8 @@ void free_assigned_device(AssignedDevInfo *adev) if (!pci_region->valid || !(pci_region->type & IORESOURCE_MEM)) continue; + kvm_remove_ioperm_data(region->u.r_baseport, region->r_size); + if (region->u.r_virtbase) { int ret = munmap(region->u.r_virtbase, (pci_region->size + 0xFFF) & 0xFFFFF000); diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c index 2ce9501..789e637 100644 --- a/qemu/qemu-kvm.c +++ b/qemu/qemu-kvm.c @@ -1317,6 +1317,23 @@ void kvm_add_ioperm_data(struct ioperm_data *data) LIST_INSERT_HEAD(&ioperm_head, data, entries); } +void kvm_remove_ioperm_data(unsigned long start_port, unsigned long num) +{ + struct ioperm_data *data; + + data = LIST_FIRST(&ioperm_head); + while (data) { + struct ioperm_data *next = LIST_NEXT(data, entries); + + if (data->start_port == start_port && data->num == num) { + LIST_REMOVE(data, entries); + qemu_free(data); + } + + data = next; + } +} + void kvm_ioperm(CPUState *env, void *data) { if (kvm_enabled() && qemu_system_ready) diff --git a/qemu/qemu-kvm.h b/qemu/qemu-kvm.h index 12bd5a0..eebf7ab 100644 --- a/qemu/qemu-kvm.h +++ b/qemu/qemu-kvm.h @@ -126,6 +126,7 @@ int kvm_uncoalesce_mmio_region(target_phys_addr_t start, ram_addr_t size); #ifdef USE_KVM_DEVICE_ASSIGNMENT void kvm_ioperm(CPUState *env, void *data); +void kvm_remove_ioperm_data(unsigned long start_port, unsigned long num); void kvm_arch_do_ioperm(void *_data); #endif -- 1.6.1