mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
libs/guest: move batch_pfns into a separate structure
Preparation for a followup patch "libs/guest: allocate various migration arrays just once". Signed-off-by: Frediano Ziglio <frediano.ziglio@citrix.com> Reviewed-by: Anthony PERARD <anthony.perard@vates.tech>
This commit is contained in:
1 parent
a91d1616d8
commit
9b0adb928c
2 files changed
+18
-15
No files matched your search
@@ -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. */
|
||||
|
||||
@@ -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,7 @@ static int write_batch(struct xc_sr_context *ctx)
|
||||
};
|
||||
|
||||
assert(nr_pfns != 0);
|
||||
assert(nr_pfns <= MAX_BATCH_SIZE);
|
||||
|
||||
/* Mfns of the batch pfns. */
|
||||
mfns = malloc(nr_pfns * sizeof(*mfns));
|
||||
@@ -141,13 +143,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 +194,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 +208,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 +236,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 +275,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 +294,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 +785,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 +819,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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||