[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/4] move XENMEM_add_to_physmap_range handling framework to common code
On Wed, 2013-12-18 at 14:35 +0000, Jan Beulich wrote: > There's really nothing really architecture specific here; the > architecture specific handling is limited to > xenmem_add_to_physmap_one(). > > Note the restriction of XENMAPSPACE_gmfn_range only being supported > through XENMEM_add_to_physmap is being dropped as being pointless. Note that this will still not work on ARM where add_to_physmap_one() does not support the gmfn_range and will still return ENOSYS. If you are dropping this restriction then xen/include/public/memory.h will need updating (likewise the first patch). Personally I think that having two redundant ways of doing the same thing is the more pointless of the two. Especially given the need to think a bit carefully about what XENMEM_add_to_physmap_range XENMAPSPACE_gmfn_range might mean... > This further eliminates the erroneous bailing from > xenmem_add_to_physmap_range() if xenmem_add_to_physmap_one() fails. > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> > > --- a/xen/arch/arm/mm.c > +++ b/xen/arch/arm/mm.c > @@ -1056,103 +1056,10 @@ int xenmem_add_to_physmap_one( > return rc; > } > > -static int xenmem_add_to_physmap_range(struct domain *d, > - struct xen_add_to_physmap_range > *xatpr) > -{ > - int rc; > - > - while ( xatpr->size > 0 ) > - { > - xen_ulong_t idx; > - xen_pfn_t gpfn; > - > - if ( unlikely(copy_from_guest_offset(&idx, xatpr->idxs, 0, 1)) ) > - { > - rc = -EFAULT; > - goto out; > - } > - > - if ( unlikely(copy_from_guest_offset(&gpfn, xatpr->gpfns, 0, 1)) ) > - { > - rc = -EFAULT; > - goto out; > - } > - > - rc = xenmem_add_to_physmap_one(d, xatpr->space, > - xatpr->foreign_domid, > - idx, gpfn); > - > - if ( unlikely(copy_to_guest_offset(xatpr->errs, 0, &rc, 1)) ) > - { > - rc = -EFAULT; > - goto out; > - } > - > - if ( rc < 0 ) > - goto out; > - > - guest_handle_add_offset(xatpr->idxs, 1); > - guest_handle_add_offset(xatpr->gpfns, 1); > - guest_handle_add_offset(xatpr->errs, 1); > - xatpr->size--; > - > - /* Check for continuation if it's not the last interation */ > - if ( xatpr->size > 0 && hypercall_preempt_check() ) > - { > - rc = -EAGAIN; > - goto out; > - } > - } > - > - rc = 0; > - > -out: > - return rc; > - > -} > - > long arch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg) > { > - int rc; > - > switch ( op ) > { > - case XENMEM_add_to_physmap_range: > - { > - struct xen_add_to_physmap_range xatpr; > - struct domain *d; > - > - if ( copy_from_guest(&xatpr, arg, 1) ) > - return -EFAULT; > - > - /* This mapspace is redundant for this hypercall */ > - if ( xatpr.space == XENMAPSPACE_gmfn_range ) > - return -EINVAL; > - > - d = rcu_lock_domain_by_any_id(xatpr.domid); > - if ( d == NULL ) > - return -ESRCH; > - > - rc = xsm_add_to_physmap(XSM_TARGET, current->domain, d); > - if ( rc ) > - { > - rcu_unlock_domain(d); > - return rc; > - } > - > - rc = xenmem_add_to_physmap_range(d, &xatpr); > - > - rcu_unlock_domain(d); > - > - if ( rc && copy_to_guest(arg, &xatpr, 1) ) > - rc = -EFAULT; > - > - if ( rc == -EAGAIN ) > - rc = hypercall_create_continuation( > - __HYPERVISOR_memory_op, "ih", op, arg); > - > - return rc; > - } > /* XXX: memsharing not working yet */ > case XENMEM_get_sharing_shared_pages: > case XENMEM_get_sharing_freed_pages: > --- a/xen/common/memory.c > +++ b/xen/common/memory.c > @@ -598,6 +598,57 @@ static int xenmem_add_to_physmap(struct > return rc; > } > > +static int xenmem_add_to_physmap_range(struct domain *d, > + struct xen_add_to_physmap_range > *xatpr) > +{ > + int rc; > + > + while ( xatpr->size > 0 ) > + { > + xen_ulong_t idx; > + xen_pfn_t gpfn; > + > + if ( unlikely(__copy_from_guest_offset(&idx, xatpr->idxs, 0, 1)) ) > + { > + rc = -EFAULT; > + goto out; > + } > + > + if ( unlikely(__copy_from_guest_offset(&gpfn, xatpr->gpfns, 0, 1)) ) > + { > + rc = -EFAULT; > + goto out; > + } > + > + rc = xenmem_add_to_physmap_one(d, xatpr->space, > + xatpr->foreign_domid, > + idx, gpfn); > + > + if ( unlikely(__copy_to_guest_offset(xatpr->errs, 0, &rc, 1)) ) > + { > + rc = -EFAULT; > + goto out; > + } > + > + guest_handle_add_offset(xatpr->idxs, 1); > + guest_handle_add_offset(xatpr->gpfns, 1); > + guest_handle_add_offset(xatpr->errs, 1); > + xatpr->size--; > + > + /* Check for continuation if it's not the last interation. */ > + if ( xatpr->size > 0 && hypercall_preempt_check() ) > + { > + rc = -EAGAIN; > + goto out; > + } > + } > + > + rc = 0; > + > +out: > + return rc; > +} > + > long do_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg) > { > struct domain *d; > @@ -763,6 +814,44 @@ long do_memory_op(unsigned long cmd, XEN > return rc; > } > > + case XENMEM_add_to_physmap_range: > + { > + struct xen_add_to_physmap_range xatpr; > + struct domain *d; > + > + if ( copy_from_guest(&xatpr, arg, 1) || > + !guest_handle_okay(xatpr.idxs, xatpr.size) || > + !guest_handle_okay(xatpr.gpfns, xatpr.size) || > + !guest_handle_okay(xatpr.errs, xatpr.size) ) > + return -EFAULT; > + > + d = rcu_lock_domain_by_any_id(xatpr.domid); > + if ( d == NULL ) > + return -ESRCH; > + > + rc = xsm_add_to_physmap(XSM_TARGET, current->domain, d); > + if ( rc ) > + { > + rcu_unlock_domain(d); > + return rc; > + } > + > + rc = xenmem_add_to_physmap_range(d, &xatpr); > + > + rcu_unlock_domain(d); > + > + if ( rc == -EAGAIN ) > + { > + if ( !__copy_to_guest(arg, &xatpr, 1) ) > + rc = hypercall_create_continuation( > + __HYPERVISOR_memory_op, "ih", op, arg); > + else > + rc = -EFAULT; > + } > + > + return rc; > + } > + > case XENMEM_remove_from_physmap: > { > struct xen_remove_from_physmap xrfp; > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > http://lists.xen.org/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |