|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v8 2/4] libs/guest: move batch_pfns into a separate structure
Prepare for following change.
Signed-off-by: Frediano Ziglio <frediano.ziglio@xxxxxxxxxx>
---
Changes since v6:
- split from "libs/guest: allocate various migration arrays just once".
Changes since v7:
- initialize "batch_pfns" on declaration.
---
tools/libs/guest/xg_sr_common.h | 5 ++++-
tools/libs/guest/xg_sr_save.c | 29 +++++++++++++++--------------
2 files changed, 19 insertions(+), 15 deletions(-)
diff --git a/tools/libs/guest/xg_sr_common.h b/tools/libs/guest/xg_sr_common.h
index f1573aefcb..7574c9f5b6 100644
--- a/tools/libs/guest/xg_sr_common.h
+++ b/tools/libs/guest/xg_sr_common.h
@@ -239,11 +239,14 @@ struct xc_sr_context
struct precopy_stats stats;
- xen_pfn_t *batch_pfns;
unsigned int nr_batch_pfns;
unsigned long *deferred_pages;
unsigned long nr_deferred_pages;
xc_hypercall_buffer_t dirty_bitmap_hbuf;
+ struct xc_sr_context_save_buffers
+ {
+ xen_pfn_t batch_pfns[MAX_BATCH_SIZE];
+ } *buffers;
} save;
struct /* Restore data. */
diff --git a/tools/libs/guest/xg_sr_save.c b/tools/libs/guest/xg_sr_save.c
index 84fdbe4140..e7c22e6500 100644
--- a/tools/libs/guest/xg_sr_save.c
+++ b/tools/libs/guest/xg_sr_save.c
@@ -75,7 +75,7 @@ static int write_checkpoint_record(struct xc_sr_context *ctx)
/*
* Writes a batch of memory as a PAGE_DATA record into the stream. The batch
- * is constructed in ctx->save.batch_pfns.
+ * is constructed in ctx->save.buffers->batch_pfns.
*
* This function:
* - gets the types for each pfn in the batch.
@@ -95,6 +95,7 @@ static int write_batch(struct xc_sr_context *ctx)
void *page, *orig_page;
uint64_t *rec_pfns = NULL;
struct iovec *iov = NULL; int iovcnt = 0;
+ xen_pfn_t *const batch_pfns = ctx->save.buffers->batch_pfns;
struct {
struct xc_sr_rhdr rec;
struct xc_sr_rec_page_data_header page_data;
@@ -110,6 +111,8 @@ static int write_batch(struct xc_sr_context *ctx)
};
assert(nr_pfns != 0);
+ assert(nr_pfns <= MAX_BATCH_SIZE);
+ assert(ctx->save.buffers);
/* Mfns of the batch pfns. */
mfns = malloc(nr_pfns * sizeof(*mfns));
@@ -141,13 +144,12 @@ static int write_batch(struct xc_sr_context *ctx)
for ( i = 0; i < nr_pfns; ++i )
{
- types[i] = mfns[i] = ctx->save.ops.pfn_to_gfn(ctx,
- ctx->save.batch_pfns[i]);
+ types[i] = mfns[i] = ctx->save.ops.pfn_to_gfn(ctx, batch_pfns[i]);
/* Likely a ballooned page. */
if ( mfns[i] == INVALID_MFN )
{
- set_bit(ctx->save.batch_pfns[i], ctx->save.deferred_pages);
+ set_bit(batch_pfns[i], ctx->save.deferred_pages);
++ctx->save.nr_deferred_pages;
}
}
@@ -193,7 +195,7 @@ static int write_batch(struct xc_sr_context *ctx)
if ( errors[p] )
{
ERROR("Mapping of pfn %#"PRIpfn" (mfn %#"PRIpfn") failed %d",
- ctx->save.batch_pfns[i], mfns[p], errors[p]);
+ batch_pfns[i], mfns[p], errors[p]);
goto err;
}
@@ -207,7 +209,7 @@ static int write_batch(struct xc_sr_context *ctx)
{
if ( rc == -1 && errno == EAGAIN )
{
- set_bit(ctx->save.batch_pfns[i], ctx->save.deferred_pages);
+ set_bit(batch_pfns[i], ctx->save.deferred_pages);
++ctx->save.nr_deferred_pages;
types[i] = XEN_DOMCTL_PFINFO_XTAB;
--nr_pages;
@@ -235,7 +237,7 @@ static int write_batch(struct xc_sr_context *ctx)
hdrs.rec.length += nr_pages * PAGE_SIZE;
for ( i = 0; i < nr_pfns; ++i )
- rec_pfns[i] = ((uint64_t)(types[i]) << 32) | ctx->save.batch_pfns[i];
+ rec_pfns[i] = ((uint64_t)(types[i]) << 32) | batch_pfns[i];
if ( writev_exact(ctx->fd, iov, iovcnt) )
{
@@ -274,9 +276,9 @@ static int flush_batch(struct xc_sr_context *ctx)
if ( !rc )
{
- VALGRIND_MAKE_MEM_UNDEFINED(ctx->save.batch_pfns,
+ VALGRIND_MAKE_MEM_UNDEFINED(ctx->save.buffers->batch_pfns,
MAX_BATCH_SIZE *
- sizeof(*ctx->save.batch_pfns));
+ sizeof(*ctx->save.buffers->batch_pfns));
}
return rc;
@@ -293,7 +295,7 @@ static int add_to_batch(struct xc_sr_context *ctx,
xen_pfn_t pfn)
rc = flush_batch(ctx);
if ( rc == 0 )
- ctx->save.batch_pfns[ctx->save.nr_batch_pfns++] = pfn;
+ ctx->save.buffers->batch_pfns[ctx->save.nr_batch_pfns++] = pfn;
return rc;
}
@@ -784,11 +786,10 @@ static int setup(struct xc_sr_context *ctx)
dirty_bitmap = xc_hypercall_buffer_alloc_pages(
xch, dirty_bitmap, NRPAGES(bitmap_size(ctx->save.p2m_size)));
- ctx->save.batch_pfns = malloc(MAX_BATCH_SIZE *
- sizeof(*ctx->save.batch_pfns));
ctx->save.deferred_pages = bitmap_alloc(ctx->save.p2m_size);
+ ctx->save.buffers = calloc(1, sizeof(*ctx->save.buffers));
- if ( !ctx->save.batch_pfns || !dirty_bitmap || !ctx->save.deferred_pages )
+ if ( !ctx->save.buffers || !dirty_bitmap || !ctx->save.deferred_pages )
{
ERROR("Unable to allocate memory for dirty bitmaps, batch pfns and"
" deferred pages");
@@ -819,7 +820,7 @@ static void cleanup(struct xc_sr_context *ctx)
xc_hypercall_buffer_free_pages(xch, dirty_bitmap,
NRPAGES(bitmap_size(ctx->save.p2m_size)));
free(ctx->save.deferred_pages);
- free(ctx->save.batch_pfns);
+ free(ctx->save.buffers);
}
/*
--
2.43.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |