[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] libxc: make do_memory_op's callers responsible for locking indirect buffers
# HG changeset patch # User Ian Campbell <ian.campbell@xxxxxxxxxx> # Date 1287419806 -3600 # Node ID 1449b5e2bad56093e6d48101b28aa99613dd9dac # Parent ba91258502025fbfdfd3b2e1deaf0b013474be47 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@xxxxxxxxxx> Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> --- tools/libxc/xc_domain.c | 28 ++++++++++++++++- tools/libxc/xc_private.c | 77 ++++++++--------------------------------------- 2 files changed, 41 insertions(+), 64 deletions(-) diff -r ba9125850202 -r 1449b5e2bad5 tools/libxc/xc_domain.c --- a/tools/libxc/xc_domain.c Mon Oct 18 17:35:59 2010 +0100 +++ b/tools/libxc/xc_domain.c Mon Oct 18 17:36:46 2010 +0100 @@ -599,9 +599,18 @@ int xc_domain_increase_reservation(xc_in }; /* may be NULL */ + if ( extent_start && lock_pages(xch, extent_start, nr_extents * sizeof(xen_pfn_t)) != 0 ) + { + PERROR("Could not lock memory for XENMEM_increase_reservation hypercall"); + return -1; + } + set_xen_guest_handle(reservation.extent_start, extent_start); err = do_memory_op(xch, XENMEM_increase_reservation, &reservation, sizeof(reservation)); + + if ( extent_start ) + unlock_pages(xch, extent_start, nr_extents * sizeof(xen_pfn_t)); return err; } @@ -647,7 +656,11 @@ int xc_domain_decrease_reservation(xc_in .domid = domid }; - set_xen_guest_handle(reservation.extent_start, extent_start); + if ( lock_pages(xch, extent_start, nr_extents * sizeof(xen_pfn_t)) != 0 ) + { + PERROR("Could not lock memory for XENMEM_decrease_reservation hypercall"); + return -1; + } if ( extent_start == NULL ) { @@ -656,7 +669,11 @@ int xc_domain_decrease_reservation(xc_in return -1; } + set_xen_guest_handle(reservation.extent_start, extent_start); + err = do_memory_op(xch, XENMEM_decrease_reservation, &reservation, sizeof(reservation)); + + unlock_pages(xch, extent_start, nr_extents * sizeof(xen_pfn_t)); return err; } @@ -715,9 +732,18 @@ int xc_domain_populate_physmap(xc_interf .mem_flags = mem_flags, .domid = domid }; + + if ( lock_pages(xch, extent_start, nr_extents * sizeof(xen_pfn_t)) != 0 ) + { + PERROR("Could not lock memory for XENMEM_populate_physmap hypercall"); + return -1; + } + set_xen_guest_handle(reservation.extent_start, extent_start); err = do_memory_op(xch, XENMEM_populate_physmap, &reservation, sizeof(reservation)); + + unlock_pages(xch, extent_start, nr_extents * sizeof(xen_pfn_t)); return err; } diff -r ba9125850202 -r 1449b5e2bad5 tools/libxc/xc_private.c --- a/tools/libxc/xc_private.c Mon Oct 18 17:35:59 2010 +0100 +++ b/tools/libxc/xc_private.c Mon Oct 18 17:36:46 2010 +0100 @@ -424,9 +424,6 @@ int do_memory_op(xc_interface *xch, int 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,68 +436,10 @@ int do_memory_op(xc_interface *xch, int 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 *x 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__ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |