[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] move XENMEM_add_to_physmap_range handling framework to common code
commit 0627c56cb6ff61e197da75c6958fff3b43159237 Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Fri Dec 20 12:01:44 2013 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Fri Dec 20 12:01:44 2013 +0100 move XENMEM_add_to_physmap_range handling framework to common code There's really nothing really architecture specific here; the architecture specific handling is limited to xenmem_add_to_physmap_one(). 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> Reviewed-by: Tim Deegan <tim@xxxxxxx> Acked-by: Keir Fraser <keir@xxxxxxx> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- xen/arch/arm/mm.c | 93 --------------------------------------------------- xen/common/memory.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 93 deletions(-) diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index 86015c7..293b6e2 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -1078,103 +1078,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: diff --git a/xen/common/memory.c b/xen/common/memory.c index 12264e0..ae0bbb8 100644 --- a/xen/common/memory.c +++ b/xen/common/memory.c @@ -595,6 +595,57 @@ static int xenmem_add_to_physmap(struct domain *d, 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 iteration. */ + 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; @@ -764,6 +815,48 @@ long do_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg) 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; + + /* This mapspace is unsupported for this hypercall. */ + if ( xatpr.space == XENMAPSPACE_gmfn_range ) + return -EOPNOTSUPP; + + 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; -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |