From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ian Campbell Subject: [PATCH XEN v7 14/29] tools/libs/foreignmemory: provide xenforeignmemory_unmap. Date: Wed, 16 Dec 2015 12:31:21 +0000 Message-ID: <1450269096-27598-15-git-send-email-ian.campbell@citrix.com> References: <1450269007.4053.48.camel@citrix.com> <1450269096-27598-1-git-send-email-ian.campbell@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1450269096-27598-1-git-send-email-ian.campbell@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: ian.jackson@eu.citrix.com, wei.liu2@citrix.com, xen-devel@lists.xen.org Cc: Ian Campbell List-Id: xen-devel@lists.xenproject.org And require it be used instead of direct munmap. This will allow e.g. Valgrind hooks to help track incorrect use of foreign mappings. Switch all uses of xenforeignmemory_map to use xenforeignmemory_unmap, not that foreign mappings via the libxc compat xc_map_foreign_* interface will not take advantage of this and will need converting. Signed-off-by: Ian Campbell Acked-by: Wei Liu Acked-by: Ian Jackson --- v4: xenforeignmemory_unmap takes pages not bytes, adjust callers. v6: Document error behaviour Use an osdep layer, although there is no current need for common code on _unmap there is for _map so use this indirection for consistency. --- tools/libs/foreignmemory/freebsd.c | 6 ++++++ tools/libs/foreignmemory/include/xenforeignmemory.h | 11 +++++++++-- tools/libs/foreignmemory/libxenforeignmemory.map | 1 + tools/libs/foreignmemory/linux.c | 6 ++++++ tools/libs/foreignmemory/minios.c | 6 ++++++ tools/libs/foreignmemory/netbsd.c | 6 ++++++ tools/libs/foreignmemory/solaris.c | 6 ++++++ tools/libxc/xc_sr_restore.c | 2 +- tools/libxc/xc_sr_save.c | 2 +- tools/libxc/xc_vm_event.c | 2 +- 10 files changed, 43 insertions(+), 5 deletions(-) diff --git a/tools/libs/foreignmemory/freebsd.c b/tools/libs/foreignmemory/freebsd.c index 4b2815d..3c3ad09 100644 --- a/tools/libs/foreignmemory/freebsd.c +++ b/tools/libs/foreignmemory/freebsd.c @@ -118,6 +118,12 @@ void *osdep_xenforeignmemory_map(xenforeignmemory_handle *fmem, return addr; } +int osdep_xenforeignmemory_unmap(xenforeignmemory_handle *fmem, + void *addr, unsigned int num) +{ + return munmap(addr, num << PAGE_SHIFT); +} + /* * Local variables: * mode: C diff --git a/tools/libs/foreignmemory/include/xenforeignmemory.h b/tools/libs/foreignmemory/include/xenforeignmemory.h index 0909585..b1cae30 100644 --- a/tools/libs/foreignmemory/include/xenforeignmemory.h +++ b/tools/libs/foreignmemory/include/xenforeignmemory.h @@ -44,8 +44,8 @@ int xenforeignmemory_close(xenforeignmemory_handle *xmem); /* * Maps a range within one domain to a local address range. Mappings - * should be unmapped with munmap and should follow the same rules as mmap - * regarding page alignment. + * must be unmapped with xenforeignmemory_unmap and should follow the + * same rules as mmap regarding page alignment. * * prot is as for mmap(2). * @@ -57,6 +57,13 @@ int xenforeignmemory_close(xenforeignmemory_handle *xmem); void *xenforeignmemory_map(xenforeignmemory_handle *fmem, uint32_t dom, int prot, const xen_pfn_t *arr, int *err, unsigned int num); +/* + * Unmap a mapping previous created with xenforeignmemory_map(). + * + * Returns 0 on success on failure sets errno and returns -1. + */ +int xenforeignmemory_unmap(xenforeignmemory_handle *fmem, + void *addr, unsigned int num); #endif diff --git a/tools/libs/foreignmemory/libxenforeignmemory.map b/tools/libs/foreignmemory/libxenforeignmemory.map index 11f0d2b..df206b3 100644 --- a/tools/libs/foreignmemory/libxenforeignmemory.map +++ b/tools/libs/foreignmemory/libxenforeignmemory.map @@ -3,5 +3,6 @@ VERS_1.0 { xenforeignmemory_open; xenforeignmemory_close; xenforeignmemory_map; + xenforeignmemory_unmap; local: *; /* Do not expose anything by default */ }; diff --git a/tools/libs/foreignmemory/linux.c b/tools/libs/foreignmemory/linux.c index b403ca7..40ecd41 100644 --- a/tools/libs/foreignmemory/linux.c +++ b/tools/libs/foreignmemory/linux.c @@ -282,6 +282,12 @@ void *osdep_xenforeignmemory_map(xenforeignmemory_handle *fmem, return addr; } +int osdep_xenforeignmemory_unmap(xenforeignmemory_handle *fmem, + void *addr, unsigned int num) +{ + return munmap(addr, (unsigned long)num << PAGE_SHIFT); +} + /* * Local variables: * mode: C diff --git a/tools/libs/foreignmemory/minios.c b/tools/libs/foreignmemory/minios.c index a542e3d..5fcb861 100644 --- a/tools/libs/foreignmemory/minios.c +++ b/tools/libs/foreignmemory/minios.c @@ -51,6 +51,12 @@ void *osdep_xenforeignmemory_map(xenforeignmemory_handle *fmem, return map_frames_ex(arr, num, 1, 0, 1, dom, err, pt_prot); } +int osdep_xenforeignmemory_unmap(xenforeignmemory_handle *fmem, + void *addr, unsigned int num) +{ + return munmap(addr, num << PAGE_SHIFT); +} + /* * Local variables: * mode: C diff --git a/tools/libs/foreignmemory/netbsd.c b/tools/libs/foreignmemory/netbsd.c index 704a096..740c26f 100644 --- a/tools/libs/foreignmemory/netbsd.c +++ b/tools/libs/foreignmemory/netbsd.c @@ -94,6 +94,12 @@ void *osdep_map_foreign_batch(xenforeignmem_handle *fmem, uint32_t dom, } +int osdep_xenforeignmemory_unmap(xenforeignmemory_handle *fmem, + void *addr, unsigned int num) +{ + return munmap(addr, num*XC_PAGE_SIZE); +} + /* * Local variables: * mode: C diff --git a/tools/libs/foreignmemory/solaris.c b/tools/libs/foreignmemory/solaris.c index f4dd634..966fccb 100644 --- a/tools/libs/foreignmemory/solaris.c +++ b/tools/libs/foreignmemory/solaris.c @@ -91,3 +91,9 @@ void *osdep_map_foreign_batch(xenforeignmem_handle *fmem, uint32_t dom, } return addr; } + +int osdep_xenforeignmemory_unmap(xenforeignmemory_handle *fmem, + void *addr, unsigned int num) +{ + return munmap(addr, num*XC_PAGE_SIZE); +} diff --git a/tools/libxc/xc_sr_restore.c b/tools/libxc/xc_sr_restore.c index 8e9e9c7..a334efd 100644 --- a/tools/libxc/xc_sr_restore.c +++ b/tools/libxc/xc_sr_restore.c @@ -378,7 +378,7 @@ static int process_page_data(struct xc_sr_context *ctx, unsigned count, err: if ( mapping ) - munmap(mapping, nr_pages * PAGE_SIZE); + xenforeignmemory_unmap(xch->fmem, mapping, nr_pages); free(map_errs); free(mfns); diff --git a/tools/libxc/xc_sr_save.c b/tools/libxc/xc_sr_save.c index 628ae07..3d78970 100644 --- a/tools/libxc/xc_sr_save.c +++ b/tools/libxc/xc_sr_save.c @@ -263,7 +263,7 @@ static int write_batch(struct xc_sr_context *ctx) err: free(rec_pfns); if ( guest_mapping ) - munmap(guest_mapping, nr_pages_mapped * PAGE_SIZE); + xenforeignmemory_unmap(xch->fmem, guest_mapping, nr_pages_mapped); for ( i = 0; local_pages && i < nr_pfns; ++i ) free(local_pages[i]); free(iov); diff --git a/tools/libxc/xc_vm_event.c b/tools/libxc/xc_vm_event.c index d2d99e4..57abce0 100644 --- a/tools/libxc/xc_vm_event.c +++ b/tools/libxc/xc_vm_event.c @@ -148,7 +148,7 @@ void *xc_vm_event_enable(xc_interface *xch, domid_t domain_id, int param, } if ( ring_page ) - munmap(ring_page, XC_PAGE_SIZE); + xenforeignmemory_unmap(xch->fmem, ring_page, 1); ring_page = NULL; errno = saved_errno; -- 2.1.4