diff options
author | Ian Campbell <ian.campbell@citrix.com> | 2010-10-18 17:36:46 +0100 |
---|---|---|
committer | Ian Campbell <ian.campbell@citrix.com> | 2010-10-18 17:36:46 +0100 |
commit | 5924f32d9c26f2b9475ea08499fbd5ca95df332c (patch) | |
tree | a591c4be94bf4b0477f06faccc046d9e1a4fd5bd /tools/libxc/xc_private.c | |
parent | 35e135f116d77823e960671db82ca667f125d617 (diff) | |
download | xen-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.c | 77 |
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__ |