WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 7/7] pass restore context as an argument instead of a

To: Xen Devel <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH 7/7] pass restore context as an argument instead of a global context
From: Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
Date: Fri, 13 Nov 2009 23:43:07 +0000
Cc: Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
Delivery-date: Fri, 13 Nov 2009 15:39:45 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <1258155787-28327-1-git-send-email-vincent.hanquez@xxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <1258155787-28327-1-git-send-email-vincent.hanquez@xxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
pass restore context as an argument instead of a global context

---
 tools/libxc/xc_domain_restore.c |   70 ++++++++++++++++++++------------------
 1 files changed, 37 insertions(+), 33 deletions(-)

diff --git a/tools/libxc/xc_domain_restore.c b/tools/libxc/xc_domain_restore.c
index 6430e91..70a50e9 100644
--- a/tools/libxc/xc_domain_restore.c
+++ b/tools/libxc/xc_domain_restore.c
@@ -44,14 +44,6 @@ struct restore_ctx {
     unsigned no_superpage_mem; /* If have enough continuous memory for super 
page allocation */
 };
 
-struct restore_ctx _ctx = {
-    .live_p2m = NULL,
-    .p2m = NULL,
-    .no_superpage_mem = 0,
-};
-
-struct restore_ctx *ctx = &_ctx;
-
 /*
 **
 **
@@ -71,7 +63,7 @@ struct restore_ctx *ctx = &_ctx;
 #define SUPER_PAGE_TRACKING(pfn) ( (pfn) != INVALID_SUPER_PAGE )
 #define SUPER_PAGE_DONE(pfn)     ( SUPER_PAGE_START(pfn) )
 
-static int super_page_populated(unsigned long pfn)
+static int super_page_populated(struct restore_ctx *ctx, unsigned long pfn)
 {
     int i;
     pfn &= ~(SUPERPAGE_NR_PFNS - 1);
@@ -88,7 +80,7 @@ static int super_page_populated(unsigned long pfn)
  * some new allocated 4K pages
  */
 static int break_super_page(int xc_handle,
-                            uint32_t dom,
+                            uint32_t dom, struct restore_ctx *ctx,
                             xen_pfn_t next_pfn)
 {
     xen_pfn_t *page_array, start_pfn, mfn;
@@ -202,6 +194,7 @@ out:
  */
 static int allocate_mfn_list(int xc_handle,
                               uint32_t dom,
+                              struct restore_ctx *ctx,
                               unsigned long nr_extents,
                               xen_pfn_t *batch_buf,
                               xen_pfn_t *next_pfn,
@@ -228,7 +221,7 @@ static int allocate_mfn_list(int xc_handle,
              !SUPER_PAGE_DONE(sp_pfn))
         {
             /* break previously allocated super page*/
-            if ( break_super_page(xc_handle, dom, sp_pfn) != 0 )
+            if ( break_super_page(xc_handle, dom, ctx, sp_pfn) != 0 )
             {
                 ERROR("Break previous super page fail!\n");
                 return 1;
@@ -251,7 +244,7 @@ static int allocate_mfn_list(int xc_handle,
         goto normal_page;
 
     pfn = batch_buf[0] & ~XEN_DOMCTL_PFINFO_LTAB_MASK;
-    if  ( super_page_populated(pfn) )
+    if  ( super_page_populated(ctx, pfn) )
         goto normal_page;
 
     pfn &= ~(SUPERPAGE_NR_PFNS - 1);
@@ -301,7 +294,7 @@ normal_page:
     return 0;
 }
 
-static int allocate_physmem(int xc_handle, uint32_t dom,
+static int allocate_physmem(int xc_handle, uint32_t dom, struct restore_ctx 
*ctx,
                             unsigned long *region_pfn_type, int region_size,
                             unsigned int hvm, xen_pfn_t *region_mfn, int 
superpages)
 {
@@ -342,7 +335,7 @@ static int allocate_physmem(int xc_handle, uint32_t dom,
         if ( SUPER_PAGE_START(pfn) )
         {
             /* Start of a 2M extent, populate previsous buf */
-            if ( allocate_mfn_list(xc_handle, dom,
+            if ( allocate_mfn_list(xc_handle, dom, ctx,
                                    batch_buf_len, batch_buf,
                                    &required_pfn, superpages) != 0 )
             {
@@ -364,7 +357,7 @@ static int allocate_physmem(int xc_handle, uint32_t dom,
         else if ( SUPER_PAGE_TRACKING(required_pfn) )
         {
             /* break of a 2M extent, populate previous buf */
-            if ( allocate_mfn_list(xc_handle, dom,
+            if ( allocate_mfn_list(xc_handle, dom, ctx,
                                    batch_buf_len, batch_buf,
                                    &required_pfn, superpages) != 0 )
             {
@@ -405,7 +398,7 @@ static int allocate_physmem(int xc_handle, uint32_t dom,
 alloc_page:
     if ( batch_buf )
     {
-        if ( allocate_mfn_list(xc_handle, dom,
+        if ( allocate_mfn_list(xc_handle, dom, ctx,
                     batch_buf_len, batch_buf,
                     &required_pfn,
                     superpages) != 0 )
@@ -498,7 +491,7 @@ static ssize_t read_exact_timed(int fd, void* buf, size_t 
size)
 ** This function inverts that operation, replacing the pfn values with
 ** the (now known) appropriate mfn values.
 */
-static int uncanonicalize_pagetable(int xc_handle, uint32_t dom, 
+static int uncanonicalize_pagetable(int xc_handle, uint32_t dom, struct 
restore_ctx *ctx,
                                     unsigned long type, void *page, int 
superpages)
 {
     int i, pte_last;
@@ -524,7 +517,7 @@ static int uncanonicalize_pagetable(int xc_handle, uint32_t 
dom,
         if ( ctx->p2m[pfn] == INVALID_P2M_ENTRY )
         {
             unsigned long force_pfn = superpages ? FORCE_SP_MASK : pfn;
-            if (allocate_mfn_list(xc_handle, dom,
+            if (allocate_mfn_list(xc_handle, dom, ctx,
                         1, &pfn, &force_pfn, superpages) != 0)
                 return 0;
         }
@@ -542,7 +535,7 @@ static int uncanonicalize_pagetable(int xc_handle, uint32_t 
dom,
 
 
 /* Load the p2m frame list, plus potential extended info chunk */
-static xen_pfn_t *load_p2m_frame_list(
+static xen_pfn_t *load_p2m_frame_list(struct restore_ctx *ctx,
     int io_fd, int *pae_extended_cr3, int *ext_vcpucontext)
 {
     xen_pfn_t *p2m_frame_list;
@@ -797,7 +790,8 @@ static int dump_qemu(uint32_t dom, struct tailbuf_hvm *buf)
     return 0;
 }
 
-static int buffer_tail_hvm(struct tailbuf_hvm *buf, int fd,
+static int buffer_tail_hvm(struct restore_ctx *ctx,
+                           struct tailbuf_hvm *buf, int fd,
                            unsigned int max_vcpu_id, uint64_t vcpumap,
                            int ext_vcpucontext)
 {
@@ -858,7 +852,8 @@ static int buffer_tail_hvm(struct tailbuf_hvm *buf, int fd,
     return -1;
 }
 
-static int buffer_tail_pv(struct tailbuf_pv *buf, int fd,
+static int buffer_tail_pv(struct restore_ctx *ctx,
+                          struct tailbuf_pv *buf, int fd,
                           unsigned int max_vcpu_id, uint64_t vcpumap,
                           int ext_vcpucontext)
 {
@@ -935,14 +930,15 @@ static int buffer_tail_pv(struct tailbuf_pv *buf, int fd,
     return -1;
 }
 
-static int buffer_tail(tailbuf_t *buf, int fd, unsigned int max_vcpu_id,
+static int buffer_tail(struct restore_ctx *ctx,
+                       tailbuf_t *buf, int fd, unsigned int max_vcpu_id,
                        uint64_t vcpumap, int ext_vcpucontext)
 {
     if ( buf->ishvm )
-        return buffer_tail_hvm(&buf->u.hvm, fd, max_vcpu_id, vcpumap,
+        return buffer_tail_hvm(ctx, &buf->u.hvm, fd, max_vcpu_id, vcpumap,
                                ext_vcpucontext);
     else
-        return buffer_tail_pv(&buf->u.pv, fd, max_vcpu_id, vcpumap,
+        return buffer_tail_pv(ctx, &buf->u.pv, fd, max_vcpu_id, vcpumap,
                               ext_vcpucontext);
 }
 
@@ -1147,8 +1143,8 @@ static int pagebuf_get(pagebuf_t* buf, int fd, int xch, 
uint32_t dom)
     return rc;
 }
 
-static int apply_batch(int xc_handle, uint32_t dom, xen_pfn_t* region_mfn,
-                       unsigned long* pfn_type, int pae_extended_cr3,
+static int apply_batch(int xc_handle, uint32_t dom, struct restore_ctx *ctx,
+                       xen_pfn_t* region_mfn, unsigned long* pfn_type, int 
pae_extended_cr3,
                        unsigned int hvm, struct xc_mmu* mmu,
                        pagebuf_t* pagebuf, int curbatch, int superpages)
 {
@@ -1167,7 +1163,7 @@ static int apply_batch(int xc_handle, uint32_t dom, 
xen_pfn_t* region_mfn,
     if (j > MAX_BATCH_SIZE)
         j = MAX_BATCH_SIZE;
 
-    if (allocate_physmem(xc_handle, dom, &pagebuf->pfn_types[curbatch],
+    if (allocate_physmem(xc_handle, dom, ctx, &pagebuf->pfn_types[curbatch],
                          j, hvm, region_mfn, superpages) != 0)
     {
         ERROR("allocate_physmem() failed\n");
@@ -1228,7 +1224,7 @@ static int apply_batch(int xc_handle, uint32_t dom, 
xen_pfn_t* region_mfn,
                 pae_extended_cr3 ||
                 (pagetype != XEN_DOMCTL_PFINFO_L1TAB)) {
 
-                if (!uncanonicalize_pagetable(xc_handle, dom,
+                if (!uncanonicalize_pagetable(xc_handle, dom, ctx,
                                               pagetype, page, superpages)) {
                     /*
                     ** Failing to uncanonicalize a page table can be ok
@@ -1335,6 +1331,14 @@ int xc_domain_restore(int xc_handle, int io_fd, uint32_t 
dom,
     tailbuf_t tailbuf, tmptail;
     void* vcpup;
 
+    /* restore context */
+    struct restore_ctx _ctx = {
+        .live_p2m = NULL,
+        .p2m = NULL,
+        .no_superpage_mem = 0,
+    };
+    struct restore_ctx *ctx = &_ctx;
+
     pagebuf_init(&pagebuf);
     memset(&tailbuf, 0, sizeof(tailbuf));
     tailbuf.ishvm = hvm;
@@ -1369,7 +1373,7 @@ int xc_domain_restore(int xc_handle, int io_fd, uint32_t 
dom,
     if ( !hvm ) 
     {
         /* Load the p2m frame list, plus potential extended info chunk */
-        p2m_frame_list = load_p2m_frame_list(
+        p2m_frame_list = load_p2m_frame_list(ctx,
             io_fd, &pae_extended_cr3, &ext_vcpucontext);
         if ( !p2m_frame_list )
             goto out;
@@ -1483,7 +1487,7 @@ int xc_domain_restore(int xc_handle, int io_fd, uint32_t 
dom,
         while ( curbatch < j ) {
             int brc;
 
-            brc = apply_batch(xc_handle, dom, region_mfn, pfn_type,
+            brc = apply_batch(xc_handle, dom, ctx, region_mfn, pfn_type,
                               pae_extended_cr3, hvm, mmu, &pagebuf, curbatch, 
superpages);
             if ( brc < 0 )
                 goto out;
@@ -1524,7 +1528,7 @@ int xc_domain_restore(int xc_handle, int io_fd, uint32_t 
dom,
     if ( !completed ) {
         int flags = 0;
 
-        if ( buffer_tail(&tailbuf, io_fd, max_vcpu_id, vcpumap,
+        if ( buffer_tail(ctx, &tailbuf, io_fd, max_vcpu_id, vcpumap,
                          ext_vcpucontext) < 0 ) {
             ERROR ("error buffering image tail");
             goto out;
@@ -1544,7 +1548,7 @@ int xc_domain_restore(int xc_handle, int io_fd, uint32_t 
dom,
     }
     memset(&tmptail, 0, sizeof(tmptail));
     tmptail.ishvm = hvm;
-    if ( buffer_tail(&tmptail, io_fd, max_vcpu_id, vcpumap,
+    if ( buffer_tail(ctx, &tmptail, io_fd, max_vcpu_id, vcpumap,
                      ext_vcpucontext) < 0 ) {
         ERROR ("error buffering image tail, finishing");
         goto finish;
@@ -1647,7 +1651,7 @@ int xc_domain_restore(int xc_handle, int io_fd, uint32_t 
dom,
                 for ( k = 0; k < j; k++ )
                 {
                     if ( !uncanonicalize_pagetable(
-                        xc_handle, dom, XEN_DOMCTL_PFINFO_L1TAB,
+                        xc_handle, dom, ctx, XEN_DOMCTL_PFINFO_L1TAB,
                         region_base + k*PAGE_SIZE, superpages) )
                     {
                         ERROR("failed uncanonicalize pt!");
-- 
1.6.5.2


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