aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxc/xc_private.c
diff options
context:
space:
mode:
authorIan Campbell <ian.campbell@citrix.com>2010-10-18 17:36:46 +0100
committerIan Campbell <ian.campbell@citrix.com>2010-10-18 17:36:46 +0100
commit5924f32d9c26f2b9475ea08499fbd5ca95df332c (patch)
treea591c4be94bf4b0477f06faccc046d9e1a4fd5bd /tools/libxc/xc_private.c
parent35e135f116d77823e960671db82ca667f125d617 (diff)
downloadxen-5924f32d9c26f2b9475ea08499fbd5ca95df332c.tar.gz
xen-5924f32d9c26f2b9475ea08499fbd5ca95df332c.tar.bz2
xen-5924f32d9c26f2b9475ea08499fbd5ca95df332c.zip
libxc: make do_memory_op's callers responsible for locking indirect buffers
Push responsibility for locking buffers refered to by the memory_op argument up into the callers (which are now all internal to libxc). This removes the last of the introspecation from do_memory_op and generally makes the transistion to hypercall buffers smoother. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
Diffstat (limited to 'tools/libxc/xc_private.c')
-rw-r--r--tools/libxc/xc_private.c77
1 files changed, 14 insertions, 63 deletions
diff --git a/tools/libxc/xc_private.c b/tools/libxc/xc_private.c
index 8ce66c5440..f2ff93ad26 100644
--- a/tools/libxc/xc_private.c
+++ b/tools/libxc/xc_private.c
@@ -424,9 +424,6 @@ int xc_flush_mmu_updates(xc_interface *xch, struct xc_mmu *mmu)
int do_memory_op(xc_interface *xch, int cmd, void *arg, size_t len)
{
DECLARE_HYPERCALL;
- struct xen_memory_reservation *reservation = arg;
- struct xen_machphys_mfn_list *xmml = arg;
- xen_pfn_t *extent_start;
long ret = -EINVAL;
hypercall.op = __HYPERVISOR_memory_op;
@@ -439,69 +436,11 @@ int do_memory_op(xc_interface *xch, int cmd, void *arg, size_t len)
goto out1;
}
- switch ( cmd )
- {
- case XENMEM_increase_reservation:
- case XENMEM_decrease_reservation:
- case XENMEM_populate_physmap:
- get_xen_guest_handle(extent_start, reservation->extent_start);
- if ( (extent_start != NULL) &&
- (lock_pages(xch, extent_start,
- reservation->nr_extents * sizeof(xen_pfn_t)) != 0) )
- {
- PERROR("Could not lock");
- unlock_pages(xch, reservation, sizeof(*reservation));
- goto out1;
- }
- break;
- case XENMEM_machphys_mfn_list:
- get_xen_guest_handle(extent_start, xmml->extent_start);
- if ( lock_pages(xch, extent_start,
- xmml->max_extents * sizeof(xen_pfn_t)) != 0 )
- {
- PERROR("Could not lock");
- unlock_pages(xch, xmml, sizeof(*xmml));
- goto out1;
- }
- break;
- case XENMEM_add_to_physmap:
- case XENMEM_current_reservation:
- case XENMEM_maximum_reservation:
- case XENMEM_maximum_gpfn:
- case XENMEM_set_pod_target:
- case XENMEM_get_pod_target:
- break;
- }
-
ret = do_xen_hypercall(xch, &hypercall);
if ( len )
unlock_pages(xch, arg, len);
- switch ( cmd )
- {
- case XENMEM_increase_reservation:
- case XENMEM_decrease_reservation:
- case XENMEM_populate_physmap:
- get_xen_guest_handle(extent_start, reservation->extent_start);
- if ( extent_start != NULL )
- unlock_pages(xch, extent_start,
- reservation->nr_extents * sizeof(xen_pfn_t));
- break;
- case XENMEM_machphys_mfn_list:
- get_xen_guest_handle(extent_start, xmml->extent_start);
- unlock_pages(xch, extent_start,
- xmml->max_extents * sizeof(xen_pfn_t));
- break;
- case XENMEM_add_to_physmap:
- case XENMEM_current_reservation:
- case XENMEM_maximum_reservation:
- case XENMEM_maximum_gpfn:
- case XENMEM_set_pod_target:
- case XENMEM_get_pod_target:
- break;
- }
-
out1:
return ret;
}
@@ -534,11 +473,23 @@ int xc_machphys_mfn_list(xc_interface *xch,
struct xen_machphys_mfn_list xmml = {
.max_extents = max_extents,
};
+
+ if ( lock_pages(xch, extent_start, max_extents * sizeof(xen_pfn_t)) != 0 )
+ {
+ PERROR("Could not lock memory for XENMEM_machphys_mfn_list hypercall");
+ return -1;
+ }
+
set_xen_guest_handle(xmml.extent_start, extent_start);
rc = do_memory_op(xch, XENMEM_machphys_mfn_list, &xmml, sizeof(xmml));
if (rc || xmml.nr_extents != max_extents)
- return -1;
- return 0;
+ rc = -1;
+ else
+ rc = 0;
+
+ unlock_pages(xch, extent_start, max_extents * sizeof(xen_pfn_t));
+
+ return rc;
}
#ifndef __ia64__