libxc: add xc_domain_memory_exchange_pages to wrap XENMEM_exchange
authorIan Campbell <ian.campbell@citrix.com>
Mon, 18 Oct 2010 16:14:07 +0000 (17:14 +0100)
committerIan Campbell <ian.campbell@citrix.com>
Mon, 18 Oct 2010 16:14:07 +0000 (17:14 +0100)
Generalised from exchange_page in xc_offline_page.c

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
tools/libxc/xc_domain.c
tools/libxc/xc_offline_page.c
tools/libxc/xenctrl.h

index 18a346d960c9dc2ff5ab76f39d58d13bafd4f361..3ec2981a6c910fd17c21bf76ab3f0fedd0fd8c11 100644 (file)
@@ -728,6 +728,37 @@ int xc_domain_populate_physmap_exact(xc_interface *xch,
     return err;
 }
 
+int xc_domain_memory_exchange_pages(xc_interface *xch,
+                                    int domid,
+                                    unsigned long nr_in_extents,
+                                    unsigned int in_order,
+                                    xen_pfn_t *in_extents,
+                                    unsigned long nr_out_extents,
+                                    unsigned int out_order,
+                                    xen_pfn_t *out_extents)
+{
+    int rc;
+
+    struct xen_memory_exchange exchange = {
+        .in = {
+            .nr_extents   = nr_in_extents,
+            .extent_order = in_order,
+            .domid        = domid
+        },
+        .out = {
+            .nr_extents   = nr_out_extents,
+            .extent_order = out_order,
+            .domid        = domid
+        }
+    };
+    set_xen_guest_handle(exchange.in.extent_start, in_extents);
+    set_xen_guest_handle(exchange.out.extent_start, out_extents);
+
+    rc = xc_memory_op(xch, XENMEM_exchange, &exchange);
+
+    return rc;
+}
+
 static int xc_domain_pod_target(xc_interface *xch,
                                 int op,
                                 uint32_t domid,
index a23cb64e323105f34480d57741b16d98293f9094..99d7d705ab4067bcbddcead9c530fb3056d80bf0 100644 (file)
@@ -512,35 +512,6 @@ static int clear_pte(xc_interface *xch, int domid,
                       __clear_pte, mfn);
 }
 
-static int exchange_page(xc_interface *xch, xen_pfn_t mfn,
-                     xen_pfn_t *new_mfn, int domid)
-{
-    int rc;
-    xen_pfn_t out_mfn;
-
-       struct xen_memory_exchange exchange = {
-               .in = {
-                       .nr_extents   = 1,
-                       .extent_order = 0,
-                       .domid        = domid
-               },
-               .out = {
-                       .nr_extents   = 1,
-                       .extent_order = 0,
-                       .domid        = domid
-               }
-    };
-    set_xen_guest_handle(exchange.in.extent_start, &mfn);
-    set_xen_guest_handle(exchange.out.extent_start, &out_mfn);
-
-    rc = xc_memory_op(xch, XENMEM_exchange, &exchange);
-
-    if (!rc)
-        *new_mfn = out_mfn;
-
-    return rc;
-}
-
 /*
  * Check if a page can be exchanged successfully
  */
@@ -704,7 +675,9 @@ int xc_exchange_page(xc_interface *xch, int domid, xen_pfn_t mfn)
         goto failed;
     }
 
-    rc = exchange_page(xch, mfn, &new_mfn, domid);
+    rc = xc_domain_memory_exchange_pages(xch, domid,
+                                        1, 0, &mfn,
+                                        1, 0, &new_mfn);
 
     if (rc)
     {
index 89f9dca60823656bb63f527207d7a747c08784e3..852bbcc8e222530d4dca828055a3f61bc2e0b1b8 100644 (file)
@@ -829,6 +829,15 @@ int xc_domain_populate_physmap_exact(xc_interface *xch,
 #define xc_domain_memory_populate_physmap(x, d, nr, eo, mf, es) \
     xc_domain_populate_physmap_exact(x, d, nr, eo, mf, es)
 
+int xc_domain_memory_exchange_pages(xc_interface *xch,
+                                    int domid,
+                                    unsigned long nr_in_extents,
+                                    unsigned int in_order,
+                                    xen_pfn_t *in_extents,
+                                    unsigned long nr_out_extents,
+                                    unsigned int out_order,
+                                    xen_pfn_t *out_extents);
+
 int xc_domain_set_pod_target(xc_interface *xch,
                              uint32_t domid,
                              uint64_t target_pages,