aboutsummaryrefslogtreecommitdiffstats
path: root/xen/common/domctl.c
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2012-12-10 11:18:25 +0100
committerJan Beulich <jbeulich@suse.com>2012-12-10 11:18:25 +0100
commite93e0d9d73ce77bd1f3471af68a194b47e0e8c45 (patch)
treebe7768d89381228bc3ed5f4867db23f631a78054 /xen/common/domctl.c
parentedaa3f893f8f046e05099bc0d087b276a90451d4 (diff)
downloadxen-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.c20
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;
}