diff options
author | Jan Beulich <jbeulich@suse.com> | 2012-12-10 11:18:25 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2012-12-10 11:18:25 +0100 |
commit | e93e0d9d73ce77bd1f3471af68a194b47e0e8c45 (patch) | |
tree | be7768d89381228bc3ed5f4867db23f631a78054 /xen/common/domctl.c | |
parent | edaa3f893f8f046e05099bc0d087b276a90451d4 (diff) | |
download | xen-e93e0d9d73ce77bd1f3471af68a194b47e0e8c45.tar.gz xen-e93e0d9d73ce77bd1f3471af68a194b47e0e8c45.tar.bz2 xen-e93e0d9d73ce77bd1f3471af68a194b47e0e8c45.zip |
streamline guest copy operations
- use the variants not validating the VA range when writing back
structures/fields to the same space that they were previously read
from
- when only a single field of a structure actually changed, copy back
just that field where possible
- consolidate copying back results in a few places
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/common/domctl.c')
-rw-r--r-- | xen/common/domctl.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/xen/common/domctl.c b/xen/common/domctl.c index a7a6b9f38d..99eea48a2b 100644 --- a/xen/common/domctl.c +++ b/xen/common/domctl.c @@ -242,6 +242,7 @@ void domctl_lock_release(void) long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) { long ret = 0; + bool_t copyback = 0; struct xen_domctl curop, *op = &curop; if ( copy_from_guest(op, u_domctl, 1) ) @@ -469,8 +470,7 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) sizeof(xen_domain_handle_t)); op->domain = d->domain_id; - if ( copy_to_guest(u_domctl, op, 1) ) - ret = -EFAULT; + copyback = 1; } break; @@ -653,8 +653,7 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) goto scheduler_op_out; ret = sched_adjust(d, &op->u.scheduler_op); - if ( copy_to_guest(u_domctl, op, 1) ) - ret = -EFAULT; + copyback = 1; scheduler_op_out: rcu_unlock_domain(d); @@ -686,8 +685,7 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) getdomaininfo(d, &op->u.getdomaininfo); op->domain = op->u.getdomaininfo.domain; - if ( copy_to_guest(u_domctl, op, 1) ) - ret = -EFAULT; + copyback = 1; getdomaininfo_out: rcu_read_unlock(&domlist_read_lock); @@ -747,8 +745,9 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) ret = copy_to_guest(op->u.vcpucontext.ctxt, c.nat, 1); #endif - if ( copy_to_guest(u_domctl, op, 1) || ret ) + if ( ret ) ret = -EFAULT; + copyback = 1; getvcpucontext_out: xfree(c.nat); @@ -786,9 +785,7 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) op->u.getvcpuinfo.cpu_time = runstate.time[RUNSTATE_running]; op->u.getvcpuinfo.cpu = v->processor; ret = 0; - - if ( copy_to_guest(u_domctl, op, 1) ) - ret = -EFAULT; + copyback = 1; getvcpuinfo_out: rcu_unlock_domain(d); @@ -1045,6 +1042,9 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) domctl_lock_release(); + if ( copyback && __copy_to_guest(u_domctl, op, 1) ) + ret = -EFAULT; + return ret; } |