[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 7/7] pass restore context as an argument instead of a global context
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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |