[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2] linux_gntshr_munmap: munmap takes a length, not a page count
This fixes a bug where if a client shares more than 1 page, the munmap call fails to clean up everything. A process which does a lot of sharing and unsharing can run out of resources. This patch also fixes in-tree callers of - xc_gntshr_munmap - xc_gnttab_munmap to supply page counts rather than lengths. Signed-off-by: David Scott <dave.scott@xxxxxxxxxx> --- tools/libvchan/init.c | 8 ++++---- tools/libvchan/io.c | 4 ++-- tools/libxc/xc_linux_osdep.c | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tools/libvchan/init.c b/tools/libvchan/init.c index c080a1c..de10817 100644 --- a/tools/libvchan/init.c +++ b/tools/libvchan/init.c @@ -129,9 +129,9 @@ out: return ring_ref; out_unmap_left: if (pages_left) - xc_gntshr_munmap(ctrl->gntshr, ctrl->read.buffer, pages_left * PAGE_SIZE); + xc_gntshr_munmap(ctrl->gntshr, ctrl->read.buffer, pages_left); out_ring: - xc_gntshr_munmap(ctrl->gntshr, ring, PAGE_SIZE); + xc_gntshr_munmap(ctrl->gntshr, ring, 1); ring_ref = -1; ctrl->ring = NULL; ctrl->write.order = ctrl->read.order = 0; @@ -204,9 +204,9 @@ static int init_gnt_cli(struct libxenvchan *ctrl, int domain, uint32_t ring_ref) out_unmap_left: if (ctrl->write.order >= PAGE_SHIFT) xc_gnttab_munmap(ctrl->gnttab, ctrl->write.buffer, - 1 << ctrl->write.order); + 1 << (ctrl->write.order - PAGE_SHIFT)); out_unmap_ring: - xc_gnttab_munmap(ctrl->gnttab, ctrl->ring, PAGE_SIZE); + xc_gnttab_munmap(ctrl->gnttab, ctrl->ring, 1); ctrl->ring = 0; ctrl->write.order = ctrl->read.order = 0; rv = -1; diff --git a/tools/libvchan/io.c b/tools/libvchan/io.c index 6e6e239..e66bc4e 100644 --- a/tools/libvchan/io.c +++ b/tools/libvchan/io.c @@ -365,10 +365,10 @@ void libxenvchan_close(struct libxenvchan *ctrl) if (ctrl->ring) { if (ctrl->is_server) { ctrl->ring->srv_live = 0; - xc_gntshr_munmap(ctrl->gntshr, ctrl->ring, PAGE_SIZE); + xc_gntshr_munmap(ctrl->gntshr, ctrl->ring, 1); } else { ctrl->ring->cli_live = 0; - xc_gnttab_munmap(ctrl->gnttab, ctrl->ring, PAGE_SIZE); + xc_gnttab_munmap(ctrl->gnttab, ctrl->ring, 1); } } if (ctrl->event) { diff --git a/tools/libxc/xc_linux_osdep.c b/tools/libxc/xc_linux_osdep.c index 86bff3e..a19e4b6 100644 --- a/tools/libxc/xc_linux_osdep.c +++ b/tools/libxc/xc_linux_osdep.c @@ -847,7 +847,7 @@ static void *linux_gntshr_share_pages(xc_gntshr *xch, xc_osdep_handle h, static int linux_gntshr_munmap(xc_gntshr *xcg, xc_osdep_handle h, void *start_address, uint32_t count) { - return munmap(start_address, count); + return munmap(start_address, count * XC_PAGE_SIZE); } static struct xc_osdep_ops linux_gntshr_ops = { -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |