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:
Frediano Ziglio authored and Anthony PERARD committed 2026-08-11 11:07:08 +02:00
1 parent a91d1616d8
commit 9b0adb928c
2 files changed
+18 -15

No files matched your search

+4 -1
View File
@@ -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. */
+14 -14
View File
@@ -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);
}
/*
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.