* [PATCH 2/3] [RESEND] kvm: qemu: fix leak of ioperm data
@ 2009-02-06 8:58 Han, Weidong
2009-02-06 10:16 ` Mark McLoughlin
0 siblings, 1 reply; 2+ messages in thread
From: Han, Weidong @ 2009-02-06 8:58 UTC (permalink / raw)
To: 'Avi Kivity'; +Cc: 'kvm@vger.kernel.org'
[-- Attachment #1: Type: text/plain, Size: 2161 bytes --]
implement kvm_remove_ioperm_data to free ioperm data, and call it
in free_assigned_device to avoid leak.
Signed-off-by: Weidong Han <weidong.han@intel.com>
---
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 5003611..82ff00a 100644
--- a/qemu/hw/device-assignment.c
+++ b/qemu/hw/device-assignment.c
@@ -457,6 +457,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 5ff63ad..f14237e 100644
--- a/qemu/qemu-kvm.c
+++ b/qemu/qemu-kvm.c
@@ -1329,6 +1329,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 042dd93..e7acd2e 100644
--- a/qemu/qemu-kvm.h
+++ b/qemu/qemu-kvm.h
@@ -127,6 +127,7 @@ struct ioperm_data;
void kvm_ioperm(CPUState *env, void *data);
void kvm_add_ioperm_data(struct ioperm_data *data);
+void kvm_remove_ioperm_data(unsigned long start_port, unsigned long num);
void kvm_arch_do_ioperm(void *_data);
#endif
--
1.6.0.4
[-- Attachment #2: 0002-kvm-qemu-fix-leak-of-ioperm-data.patch --]
[-- Type: application/octet-stream, Size: 2300 bytes --]
From 173314751f8328e39b7af2b81914cbd873b5bd03 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] 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.
Signed-off-by: Weidong Han <weidong.han@intel.com>
---
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 5003611..82ff00a 100644
--- a/qemu/hw/device-assignment.c
+++ b/qemu/hw/device-assignment.c
@@ -457,6 +457,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 5ff63ad..f14237e 100644
--- a/qemu/qemu-kvm.c
+++ b/qemu/qemu-kvm.c
@@ -1329,6 +1329,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 042dd93..e7acd2e 100644
--- a/qemu/qemu-kvm.h
+++ b/qemu/qemu-kvm.h
@@ -127,6 +127,7 @@ struct ioperm_data;
void kvm_ioperm(CPUState *env, void *data);
void kvm_add_ioperm_data(struct ioperm_data *data);
+void kvm_remove_ioperm_data(unsigned long start_port, unsigned long num);
void kvm_arch_do_ioperm(void *_data);
#endif
--
1.6.0.4
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH 2/3] [RESEND] kvm: qemu: fix leak of ioperm data
2009-02-06 8:58 [PATCH 2/3] [RESEND] kvm: qemu: fix leak of ioperm data Han, Weidong
@ 2009-02-06 10:16 ` Mark McLoughlin
0 siblings, 0 replies; 2+ messages in thread
From: Mark McLoughlin @ 2009-02-06 10:16 UTC (permalink / raw)
To: Han, Weidong; +Cc: 'Avi Kivity', 'kvm@vger.kernel.org'
On Fri, 2009-02-06 at 16:58 +0800, Han, Weidong wrote:
> implement kvm_remove_ioperm_data to free ioperm data, and call it
> in free_assigned_device to avoid leak.
>
> Signed-off-by: Weidong Han <weidong.han@intel.com>
Acked-by: Mark McLoughlin <markmc@redhat.com>
Cheers,
Mark.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2009-02-06 10:16 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-02-06 8:58 [PATCH 2/3] [RESEND] kvm: qemu: fix leak of ioperm data Han, Weidong
2009-02-06 10:16 ` Mark McLoughlin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox