[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.