[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 4/7] move the suspend_ctx on the save stack instead of a global one



move the suspend_ctx on the save stack instead of a global one

---
 tools/libxc/xc_domain_save.c |   28 +++++++++++++++-------------
 1 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/tools/libxc/xc_domain_save.c b/tools/libxc/xc_domain_save.c
index 97bd4ad..341b0e0 100644
--- a/tools/libxc/xc_domain_save.c
+++ b/tools/libxc/xc_domain_save.c
@@ -41,13 +41,6 @@ struct suspend_ctx {
     xen_pfn_t *live_p2m; /* Live mapping of the table mapping each PFN to its 
current MFN. */
 };
 
-struct suspend_ctx _ctx = {
-       .live_p2m = NULL,
-       .live_m2p = NULL,
-};
-
-struct suspend_ctx *ctx = &_ctx;
-
 /* buffer for output */
 struct outbuf {
     void* buf;
@@ -398,6 +391,7 @@ static int print_stats(int xc_handle, uint32_t domid, int 
pages_sent,
 
 
 static int analysis_phase(int xc_handle, uint32_t domid,
+                          struct suspend_ctx *ctx,
                           unsigned long *arr, int runs)
 {
     long long start, now;
@@ -454,6 +448,7 @@ static int suspend_and_state(int (*suspend)(void*), void* 
data,
 ** it to update the MFN to a reasonable value.
 */
 static void *map_frame_list_list(int xc_handle, uint32_t dom,
+                                 struct suspend_ctx *ctx,
                                  shared_info_any_t *shinfo)
 {
     int count = 100;
@@ -488,7 +483,8 @@ static void *map_frame_list_list(int xc_handle, uint32_t 
dom,
 ** which entries do not require canonicalization (in particular, those
 ** entries which map the virtual address reserved for the hypervisor).
 */
-static int canonicalize_pagetable(unsigned long type, unsigned long pfn,
+static int canonicalize_pagetable(struct suspend_ctx *ctx,
+                           unsigned long type, unsigned long pfn,
                            const void *spage, void *dpage)
 {
 
@@ -669,6 +665,7 @@ err0:
 static xen_pfn_t *map_and_save_p2m_table(int xc_handle, 
                                          int io_fd, 
                                          uint32_t dom,
+                                         struct suspend_ctx *ctx,
                                          shared_info_any_t *live_shinfo)
 {
     vcpu_guest_context_any_t ctxt;
@@ -686,7 +683,7 @@ static xen_pfn_t *map_and_save_p2m_table(int xc_handle,
 
     int i, success = 0;
 
-    live_p2m_frame_list_list = map_frame_list_list(xc_handle, dom,
+    live_p2m_frame_list_list = map_frame_list_list(xc_handle, dom, ctx,
                                                    live_shinfo);
     if ( !live_p2m_frame_list_list )
         goto out;
@@ -892,9 +889,14 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t dom, 
uint32_t max_iters,
     unsigned long mfn;
 
     struct outbuf ob;
-
     int completed = 0;
 
+    struct suspend_ctx _ctx = {
+        .live_p2m = NULL,
+        .live_m2p = NULL,
+    };
+    struct suspend_ctx *ctx = &_ctx;
+
     outbuf_init(&ob, OUTBUF_SIZE);
 
     /* If no explicit control parameters given, use defaults */
@@ -1022,7 +1024,7 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t 
dom, uint32_t max_iters,
         }
     }
 
-    analysis_phase(xc_handle, dom, to_skip, 0);
+    analysis_phase(xc_handle, dom, ctx, to_skip, 0);
 
     pfn_type   = xg_memalign(PAGE_SIZE, ROUNDUP(
                               MAX_BATCH_SIZE * sizeof(*pfn_type), PAGE_SHIFT));
@@ -1061,7 +1063,7 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t 
dom, uint32_t max_iters,
         int err = 0;
 
         /* Map the P2M table, and write the list of P2M frames */
-        ctx->live_p2m = map_and_save_p2m_table(xc_handle, io_fd, dom, 
live_shinfo);
+        ctx->live_p2m = map_and_save_p2m_table(xc_handle, io_fd, dom, ctx, 
live_shinfo);
         if ( ctx->live_p2m == NULL )
         {
             ERROR("Failed to map/save the p2m frame list");
@@ -1349,7 +1351,7 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t 
dom, uint32_t max_iters,
                 {
                     /* We have a pagetable page: need to rewrite it. */
                     race = 
-                        canonicalize_pagetable(pagetype, pfn, spage, page); 
+                        canonicalize_pagetable(ctx, pagetype, pfn, spage, 
page); 
 
                     if ( race && !live )
                     {
-- 
1.6.5.2


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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