On 03/12/15 11:22, Ian Campbell wrote: > It can trivially be replaced by xc_map_foreign_pages which is the > interface I want to move to going forward (by standardising on _bulk > but handling err=NULL as _pages does). > > The callers of _batch are checking a mixture of a NULL return or > looking to see if the top nibble of the (usually sole) mfn they pass > has been modified to be non-zero to detect errors. _pages never > modifies the mfn it was given (it's const) and returns NULL on > failure, so adjust the error handling where necessary. Some callers > use a copy of the mfn array, for reuse on failure with _batch, which > is no longer necessary as _pages doesn't modify the array, however I > haven't cleaned that up here. > > This reduces the twist maze of xc_map_foreign_* by one, which will be > useful when trying to come up with an underlying stable interface. > > NetBSD and Solaris implemented xc_map_foreign_bulk in terms of > xc_map_foreign_batch via a compat layer, so xc_map_foreign_batch > becomes an internal osdep for them. New OS ports should always > implement xc_map_foreign_bulk instead.
"New OS ports should always implement xc_map_foreign_pages instead"? Other than that: Acked-by: George Dunlap <george.dun...@citrix.com> > > Signed-off-by: Ian Campbell <ian.campb...@citrix.com> > Cc: George Dunlap <george.dun...@eu.citrix.com> > --- > v6: Switch to xc_map_foreign_pages not xc_map_foreign_bulk, since the > former has more similar error handling semantics to the current > usage. > > Dropped acks. > --- > tools/libxc/include/xenctrl.h | 10 ------- > tools/libxc/xc_foreign_memory.c | 4 ++- > tools/libxc/xc_linux_osdep.c | 59 > +++-------------------------------------- > tools/libxc/xc_minios.c | 22 --------------- > tools/libxc/xc_netbsd.c | 10 +++---- > tools/libxc/xc_solaris.c | 6 ++--- > tools/libxc/xc_vm_event.c | 18 ++++++++++--- > tools/xenmon/xenbaked.c | 12 ++++++++- > tools/xenpaging/xenpaging.c | 14 +++++----- > tools/xentrace/xentrace.c | 3 ++- > 10 files changed, 48 insertions(+), 110 deletions(-) > > diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h > index 78400d3..cb41c07 100644 > --- a/tools/libxc/include/xenctrl.h > +++ b/tools/libxc/include/xenctrl.h > @@ -1387,16 +1387,6 @@ void *xc_map_foreign_pages(xc_interface *xch, uint32_t > dom, int prot, > const xen_pfn_t *arr, int num ); > > /** > - * DEPRECATED - use xc_map_foreign_bulk() instead. > - * > - * Like xc_map_foreign_pages(), except it can succeeed partially. > - * When a page cannot be mapped, its PFN in @arr is or'ed with > - * 0xF0000000 to indicate the error. > - */ > -void *xc_map_foreign_batch(xc_interface *xch, uint32_t dom, int prot, > - xen_pfn_t *arr, int num ); > - > -/** > * Like xc_map_foreign_pages(), except it can succeed partially. > * When a page cannot be mapped, its respective field in @err is > * set to the corresponding errno value. > diff --git a/tools/libxc/xc_foreign_memory.c b/tools/libxc/xc_foreign_memory.c > index b205bca..2413e75 100644 > --- a/tools/libxc/xc_foreign_memory.c > +++ b/tools/libxc/xc_foreign_memory.c > @@ -55,6 +55,8 @@ void *xc_map_foreign_pages(xc_interface *xch, uint32_t dom, > int prot, > * just implement xc_map_foreign_bulk. > */ > #if defined(__NetBSD__) || defined(__sun__) > +void *osdep_map_foreign_batch(xc_interface *xch, uint32_t dom, int prot, > + xen_pfn_t *arr, int num ); > void *xc_map_foreign_bulk(xc_interface *xch, > uint32_t dom, int prot, > const xen_pfn_t *arr, int *err, unsigned int num) > @@ -75,7 +77,7 @@ void *xc_map_foreign_bulk(xc_interface *xch, > } > > memcpy(pfn, arr, num * sizeof(*arr)); > - ret = xc_map_foreign_batch(xch, dom, prot, pfn, num); > + ret = osdep_map_foreign_batch(xch, dom, prot, pfn, num); > > if (ret) { > for (i = 0; i < num; ++i) > diff --git a/tools/libxc/xc_linux_osdep.c b/tools/libxc/xc_linux_osdep.c > index e68c495..39c88ce 100644 > --- a/tools/libxc/xc_linux_osdep.c > +++ b/tools/libxc/xc_linux_osdep.c > @@ -91,8 +91,8 @@ int osdep_privcmd_close(xc_interface *xch) > return close(fd); > } > > -static int xc_map_foreign_batch_single(int fd, uint32_t dom, > - xen_pfn_t *mfn, unsigned long addr) > +static int map_foreign_batch_single(int fd, uint32_t dom, > + xen_pfn_t *mfn, unsigned long addr) > { > privcmd_mmapbatch_t ioctlx; > int rc; > @@ -113,59 +113,6 @@ static int xc_map_foreign_batch_single(int fd, uint32_t > dom, > return rc; > } > > -void *xc_map_foreign_batch(xc_interface *xch, > - uint32_t dom, int prot, > - xen_pfn_t *arr, int num) > -{ > - int fd = xch->privcmdfd; > - privcmd_mmapbatch_t ioctlx; > - void *addr; > - int rc; > - > - addr = mmap(NULL, num << XC_PAGE_SHIFT, prot, MAP_SHARED, fd, 0); > - if ( addr == MAP_FAILED ) > - { > - PERROR("xc_map_foreign_batch: mmap failed"); > - return NULL; > - } > - > - ioctlx.num = num; > - ioctlx.dom = dom; > - ioctlx.addr = (unsigned long)addr; > - ioctlx.arr = arr; > - > - rc = ioctl(fd, IOCTL_PRIVCMD_MMAPBATCH, &ioctlx); > - if ( (rc < 0) && (errno == ENOENT) ) > - { > - int i; > - > - for ( i = 0; i < num; i++ ) > - { > - if ( (arr[i] & PRIVCMD_MMAPBATCH_MFN_ERROR) == > - PRIVCMD_MMAPBATCH_PAGED_ERROR ) > - { > - unsigned long paged_addr = (unsigned long)addr + (i << > XC_PAGE_SHIFT); > - rc = xc_map_foreign_batch_single(fd, dom, &arr[i], > - paged_addr); > - if ( rc < 0 ) > - goto out; > - } > - } > - } > - > - out: > - if ( rc < 0 ) > - { > - int saved_errno = errno; > - PERROR("xc_map_foreign_batch: ioctl failed"); > - (void)munmap(addr, num << XC_PAGE_SHIFT); > - errno = saved_errno; > - return NULL; > - } > - > - return addr; > -} > - > /* > * Retry mmap of all paged gfns in batches > * retuns < 0 on fatal error > @@ -305,7 +252,7 @@ void *xc_map_foreign_bulk(xc_interface *xch, > err[i] = rc ?: -EINVAL; > continue; > } > - rc = xc_map_foreign_batch_single(fd, dom, pfn + i, > + rc = map_foreign_batch_single(fd, dom, pfn + i, > (unsigned long)addr + ((unsigned > long)i<<XC_PAGE_SHIFT)); > if ( rc < 0 ) > { > diff --git a/tools/libxc/xc_minios.c b/tools/libxc/xc_minios.c > index e3c8241..3ea3124 100644 > --- a/tools/libxc/xc_minios.c > +++ b/tools/libxc/xc_minios.c > @@ -73,28 +73,6 @@ void *xc_map_foreign_bulk(xc_interface *xch, > return map_frames_ex(arr, num, 1, 0, 1, dom, err, pt_prot); > } > > -void *xc_map_foreign_batch(xc_interface *xch, > - uint32_t dom, int prot, > - xen_pfn_t *arr, int num) > -{ > - unsigned long pt_prot = 0; > - int err[num]; > - int i; > - unsigned long addr; > - > - if (prot & PROT_READ) > - pt_prot = L1_PROT_RO; > - if (prot & PROT_WRITE) > - pt_prot = L1_PROT; > - > - addr = (unsigned long) map_frames_ex(arr, num, 1, 0, 1, dom, err, > pt_prot); > - for (i = 0; i < num; i++) { > - if (err[i]) > - arr[i] |= 0xF0000000; > - } > - return (void *) addr; > -} > - > void *xc_map_foreign_range(xc_interface *xch, > uint32_t dom, > int size, int prot, > diff --git a/tools/libxc/xc_netbsd.c b/tools/libxc/xc_netbsd.c > index d7f7f31..6a7ff9f 100644 > --- a/tools/libxc/xc_netbsd.c > +++ b/tools/libxc/xc_netbsd.c > @@ -67,16 +67,16 @@ int osdep_privcmd_close(xc_interface *xch) > return close(fd); > } > > -void *xc_map_foreign_batch(xc_interface *xch, > - uint32_t dom, int prot, > - xen_pfn_t *arr, int num) > +void *osdep_map_foreign_batch(xc_interface *xch, > + uint32_t dom, int prot, > + xen_pfn_t *arr, int num) > { > int fd = xch->privcmdfd; > privcmd_mmapbatch_t ioctlx; > void *addr; > addr = mmap(NULL, num*XC_PAGE_SIZE, prot, MAP_ANON | MAP_SHARED, -1, 0); > if ( addr == MAP_FAILED ) { > - PERROR("xc_map_foreign_batch: mmap failed"); > + PERROR("osdep_map_foreign_batch: mmap failed"); > return NULL; > } > > @@ -87,7 +87,7 @@ void *xc_map_foreign_batch(xc_interface *xch, > if ( ioctl(fd, IOCTL_PRIVCMD_MMAPBATCH, &ioctlx) < 0 ) > { > int saved_errno = errno; > - PERROR("xc_map_foreign_batch: ioctl failed"); > + PERROR("osdep_map_foreign_batch: ioctl failed"); > (void)munmap(addr, num*XC_PAGE_SIZE); > errno = saved_errno; > return NULL; > diff --git a/tools/libxc/xc_solaris.c b/tools/libxc/xc_solaris.c > index 5e72dee..2df7a06 100644 > --- a/tools/libxc/xc_solaris.c > +++ b/tools/libxc/xc_solaris.c > @@ -67,9 +67,9 @@ int osdep_privcmd_close(xc_interface *xch) > return close(fd); > } > > -void *xc_map_foreign_batch(xc_interface *xch, > - uint32_t dom, int prot, > - xen_pfn_t *arr, int num) > +void *osdep_map_foreign_batch(xc_interface *xch, > + uint32_t dom, int prot, > + xen_pfn_t *arr, int num) > { > int fd = xch->privcmdfd; > privcmd_mmapbatch_t ioctlx; > diff --git a/tools/libxc/xc_vm_event.c b/tools/libxc/xc_vm_event.c > index 2fef96a..d2d99e4 100644 > --- a/tools/libxc/xc_vm_event.c > +++ b/tools/libxc/xc_vm_event.c > @@ -72,9 +72,9 @@ void *xc_vm_event_enable(xc_interface *xch, domid_t > domain_id, int param, > > ring_pfn = pfn; > mmap_pfn = pfn; > - ring_page = xc_map_foreign_batch(xch, domain_id, PROT_READ | PROT_WRITE, > + ring_page = xc_map_foreign_pages(xch, domain_id, PROT_READ | PROT_WRITE, > &mmap_pfn, 1); > - if ( mmap_pfn & XEN_DOMCTL_PFINFO_XTAB ) > + if ( !ring_page ) > { > /* Map failed, populate ring page */ > rc1 = xc_domain_populate_physmap_exact(xch, domain_id, 1, 0, 0, > @@ -86,9 +86,9 @@ void *xc_vm_event_enable(xc_interface *xch, domid_t > domain_id, int param, > } > > mmap_pfn = ring_pfn; > - ring_page = xc_map_foreign_batch(xch, domain_id, PROT_READ | > PROT_WRITE, > + ring_page = xc_map_foreign_pages(xch, domain_id, PROT_READ | > PROT_WRITE, > &mmap_pfn, 1); > - if ( mmap_pfn & XEN_DOMCTL_PFINFO_XTAB ) > + if ( !ring_page ) > { > PERROR("Could not map the ring page\n"); > goto out; > @@ -156,3 +156,13 @@ void *xc_vm_event_enable(xc_interface *xch, domid_t > domain_id, int param, > > return ring_page; > } > + > +/* > + * Local variables: > + * mode: C > + * c-file-style: "BSD" > + * c-basic-offset: 4 > + * tab-width: 4 > + * indent-tabs-mode: nil > + * End: > + */ > diff --git a/tools/xenmon/xenbaked.c b/tools/xenmon/xenbaked.c > index e4602ef..da46126 100644 > --- a/tools/xenmon/xenbaked.c > +++ b/tools/xenmon/xenbaked.c > @@ -411,7 +411,7 @@ static struct t_struct *map_tbufs(unsigned long > tbufs_mfn, unsigned int num, > for ( j=0; j<tbufs.t_info->tbuf_size; j++) > pfn_list[j] = (xen_pfn_t)mfn_list[j]; > > - tbufs.meta[i] = xc_map_foreign_batch(xc_handle, DOMID_XEN, > + tbufs.meta[i] = xc_map_foreign_pages(xc_handle, DOMID_XEN, > PROT_READ | PROT_WRITE, > pfn_list, > tbufs.t_info->tbuf_size); > @@ -1175,3 +1175,13 @@ static int process_record(int cpu, struct t_rec *r) > > return 4 + (r->cycles_included ? 8 : 0) + (r->extra_u32 * 4); > } > + > +/* > + * Local variables: > + * mode: C > + * c-file-style: "BSD" > + * c-basic-offset: 4 > + * tab-width: 4 > + * indent-tabs-mode: nil > + * End: > + */ > diff --git a/tools/xenpaging/xenpaging.c b/tools/xenpaging/xenpaging.c > index df99c6a..c4bc713 100644 > --- a/tools/xenpaging/xenpaging.c > +++ b/tools/xenpaging/xenpaging.c > @@ -342,9 +342,9 @@ static struct xenpaging *xenpaging_init(int argc, char > *argv[]) > HVM_PARAM_PAGING_RING_PFN, &ring_pfn); > mmap_pfn = ring_pfn; > paging->vm_event.ring_page = > - xc_map_foreign_batch(xch, paging->vm_event.domain_id, > - PROT_READ | PROT_WRITE, &mmap_pfn, 1); > - if ( mmap_pfn & XEN_DOMCTL_PFINFO_XTAB ) > + xc_map_foreign_pages(xch, paging->vm_event.domain_id, > + PROT_READ | PROT_WRITE, &mmap_pfn, 1); > + if ( !paging->vm_event.ring_page ) > { > /* Map failed, populate ring page */ > rc = xc_domain_populate_physmap_exact(paging->xc_handle, > @@ -356,11 +356,11 @@ static struct xenpaging *xenpaging_init(int argc, char > *argv[]) > goto err; > } > > - mmap_pfn = ring_pfn; > paging->vm_event.ring_page = > - xc_map_foreign_batch(xch, paging->vm_event.domain_id, > - PROT_READ | PROT_WRITE, &mmap_pfn, 1); > - if ( mmap_pfn & XEN_DOMCTL_PFINFO_XTAB ) > + xc_map_foreign_pages(xch, paging->vm_event.domain_id, > + PROT_READ | PROT_WRITE, > + &mmap_pfn, 1); > + if ( !paging->vm_event.ring_page ) > { > PERROR("Could not map the ring page\n"); > goto err; > diff --git a/tools/xentrace/xentrace.c b/tools/xentrace/xentrace.c > index c970d42..6cbe0ac 100644 > --- a/tools/xentrace/xentrace.c > +++ b/tools/xentrace/xentrace.c > @@ -508,7 +508,7 @@ static struct t_struct *map_tbufs(unsigned long > tbufs_mfn, unsigned int num, > for ( j=0; j<tbufs.t_info->tbuf_size; j++) > pfn_list[j] = (xen_pfn_t)mfn_list[j]; > > - tbufs.meta[i] = xc_map_foreign_batch(xc_handle, DOMID_XEN, > + tbufs.meta[i] = xc_map_foreign_pages(xc_handle, DOMID_XEN, > PROT_READ | PROT_WRITE, > pfn_list, > tbufs.t_info->tbuf_size); > @@ -1221,6 +1221,7 @@ int main(int argc, char **argv) > > return ret; > } > + > /* > * Local variables: > * mode: C > _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel