|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] libxc: fix memory leak in migration v2
On July 24, 2015 6:40:27 PM EDT, Wei Liu <wei.liu2@xxxxxxxxxx> wrote:
>Originally there was only one counter to keep track of pages. It was
>used erroneously to keep track of how many pages were mapped and how
>many pages needed to be send. In the
sent
> end munmap(2) always has 0 as the
>length argument, which resulted in leaking the mapping.
>
>This problem is discovered on 32bit toolstack because 32bit application
/is/was/
>has notably smaller address space. In fact this bug affects 64bit
>toolstack too.
s/has/have/
>
>Use a separate counter to keep track of how many pages to send to solve
>this issue.
>
>Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
>---
>Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
>Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
>Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
>---
> tools/libxc/xc_sr_save.c | 18 ++++++++++--------
> 1 file changed, 10 insertions(+), 8 deletions(-)
>
>diff --git a/tools/libxc/xc_sr_save.c b/tools/libxc/xc_sr_save.c
>index d63b783..bbcfeb6 100644
>--- a/tools/libxc/xc_sr_save.c
>+++ b/tools/libxc/xc_sr_save.c
>@@ -84,7 +84,7 @@ static int write_batch(struct xc_sr_context *ctx)
> void **guest_data = NULL;
> void **local_pages = NULL;
> int *errors = NULL, rc = -1;
>- unsigned i, p, nr_pages = 0;
>+ unsigned i, p, nr_pages = 0, nr_pages_to_send;
> unsigned nr_pfns = ctx->save.nr_batch_pfns;
> void *page, *orig_page;
> uint64_t *rec_pfns = NULL;
>@@ -151,10 +151,12 @@ static int write_batch(struct xc_sr_context *ctx)
> mfns[nr_pages++] = mfns[i];
> }
>
>- if ( nr_pages > 0 )
>+ nr_pages_to_send = nr_pages;
>+
>+ if ( nr_pages_to_send > 0 )
> {
> guest_mapping = xc_map_foreign_bulk(
>- xch, ctx->domid, PROT_READ, mfns, errors, nr_pages);
>+ xch, ctx->domid, PROT_READ, mfns, errors,
>nr_pages_to_send);
> if ( !guest_mapping )
> {
> PERROR("Failed to map guest pages");
>@@ -191,7 +193,7 @@ static int write_batch(struct xc_sr_context *ctx)
> set_bit(ctx->save.batch_pfns[i], ctx->save.deferred_pages);
> ++ctx->save.nr_deferred_pages;
> types[i] = XEN_DOMCTL_PFINFO_XTAB;
>- --nr_pages;
>+ --nr_pages_to_send;
> }
> else
> goto err;
>@@ -216,7 +218,7 @@ static int write_batch(struct xc_sr_context *ctx)
>
> rec.length = sizeof(hdr);
> rec.length += nr_pfns * sizeof(*rec_pfns);
>- rec.length += nr_pages * PAGE_SIZE;
>+ rec.length += nr_pages_to_send * PAGE_SIZE;
>
> for ( i = 0; i < nr_pfns; ++i )
> rec_pfns[i] = ((uint64_t)(types[i]) << 32) | ctx->save.batch_pfns[i];
>@@ -235,7 +237,7 @@ static int write_batch(struct xc_sr_context *ctx)
>
> iovcnt = 4;
>
>- if ( nr_pages )
>+ if ( nr_pages_to_send )
> {
> for ( i = 0; i < nr_pfns; ++i )
> {
>@@ -244,7 +246,7 @@ static int write_batch(struct xc_sr_context *ctx)
> iov[iovcnt].iov_base = guest_data[i];
> iov[iovcnt].iov_len = PAGE_SIZE;
> iovcnt++;
>- --nr_pages;
>+ --nr_pages_to_send;
> }
> }
> }
>@@ -256,7 +258,7 @@ static int write_batch(struct xc_sr_context *ctx)
> }
>
> /* Sanity check we have sent all the pages we expected to. */
>- assert(nr_pages == 0);
>+ assert(nr_pages_to_send == 0);
> rc = ctx->save.nr_batch_pfns = 0;
>
> err:
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |