You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.3 KiB
75 lines
2.3 KiB
11 years ago
|
From: Roger Pau Monne
|
||
|
Subject: [Qemu-devel] [PATCH RFC 2/3] xen_disk: fix memory leak
|
||
|
Date: Mon, 31 Dec 2012 13:16:13 +0100
|
||
|
|
||
|
On ioreq_release the full ioreq
|
||
|
was memset to 0, loosing all the data
|
||
|
and memory allocations inside the QEMUIOVector, which leads to a
|
||
|
memory leak. Create a new function to specifically reset ioreq.
|
||
|
|
||
|
Reported-by: Maik Wessler <address@hidden>
|
||
|
Signed-off-by: Roger Pau Monné <address@hidden>
|
||
|
Cc: address@hidden
|
||
|
Cc: Stefano Stabellini <address@hidden>
|
||
|
Cc: Anthony PERARD <address@hidden>
|
||
|
---
|
||
|
hw/xen_disk.c | 28 ++++++++++++++++++++++++++--
|
||
|
1 files changed, 26 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/hw/xen_disk.c b/hw/xen_disk.c
|
||
|
index a159ee5..1eb485a 100644
|
||
|
--- a/tools/qemu-xen/hw/xen_disk.c
|
||
|
+++ b/tools/qemu-xen/hw/xen_disk.c
|
||
|
@@ -113,6 +113,31 @@ struct XenBlkDev {
|
||
|
|
||
|
/* ------------------------------------------------------------- */
|
||
|
|
||
|
+static void ioreq_reset(struct ioreq *ioreq)
|
||
|
+{
|
||
|
+ memset(&ioreq->req, 0, sizeof(ioreq->req));
|
||
|
+ ioreq->status = 0;
|
||
|
+ ioreq->start = 0;
|
||
|
+ ioreq->presync = 0;
|
||
|
+ ioreq->postsync = 0;
|
||
|
+ ioreq->mapped = 0;
|
||
|
+
|
||
|
+ memset(ioreq->domids, 0, sizeof(ioreq->domids));
|
||
|
+ memset(ioreq->refs, 0, sizeof(ioreq->refs));
|
||
|
+ ioreq->prot = 0;
|
||
|
+ memset(ioreq->page, 0, sizeof(ioreq->page));
|
||
|
+ ioreq->pages = NULL;
|
||
|
+
|
||
|
+ ioreq->aio_inflight = 0;
|
||
|
+ ioreq->aio_errors = 0;
|
||
|
+
|
||
|
+ ioreq->blkdev = NULL;
|
||
|
+ memset(&ioreq->list, 0, sizeof(ioreq->list));
|
||
|
+ memset(&ioreq->acct, 0, sizeof(ioreq->acct));
|
||
|
+
|
||
|
+ qemu_iovec_reset(&ioreq->v);
|
||
|
+}
|
||
|
+
|
||
|
static struct ioreq *ioreq_start(struct XenBlkDev *blkdev)
|
||
|
{
|
||
|
struct ioreq *ioreq = NULL;
|
||
|
@@ -130,7 +155,6 @@ static struct ioreq *ioreq_start(struct XenBlkDev *blkdev)
|
||
|
/* get one from freelist */
|
||
|
ioreq = QLIST_FIRST(&blkdev->freelist);
|
||
|
QLIST_REMOVE(ioreq, list);
|
||
|
- qemu_iovec_reset(&ioreq->v);
|
||
|
}
|
||
|
QLIST_INSERT_HEAD(&blkdev->inflight, ioreq, list);
|
||
|
blkdev->requests_inflight++;
|
||
|
@@ -154,7 +178,7 @@ static void ioreq_release(struct ioreq *ioreq, bool finish)
|
||
|
struct XenBlkDev *blkdev = ioreq->blkdev;
|
||
|
|
||
|
QLIST_REMOVE(ioreq, list);
|
||
|
- memset(ioreq, 0, sizeof(*ioreq));
|
||
|
+ ioreq_reset(ioreq);
|
||
|
ioreq->blkdev = blkdev;
|
||
|
QLIST_INSERT_HEAD(&blkdev->freelist, ioreq, list);
|
||
|
if (finish) {
|
||
|
--
|
||
|
1.7.7.5 (Apple Git-26)
|
||
|
|