|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v3 8/9] libs/guest: fill directly iov structure
From: Frediano Ziglio <frediano.ziglio@xxxxxxxxxx>
Instead of storing page pointers into an array and lately adding to
iov vector add the pages directly to iov to avoid "guest_data"
array.
Signed-off-by: Frediano Ziglio <frediano.ziglio@xxxxxxxxxx>
---
tools/libs/guest/xg_sr_common.h | 1 -
tools/libs/guest/xg_sr_save.c | 62 ++++++++++++---------------------
2 files changed, 22 insertions(+), 41 deletions(-)
diff --git a/tools/libs/guest/xg_sr_common.h b/tools/libs/guest/xg_sr_common.h
index 77312bae9cf5..797b4d1a7da1 100644
--- a/tools/libs/guest/xg_sr_common.h
+++ b/tools/libs/guest/xg_sr_common.h
@@ -215,7 +215,6 @@ struct xc_sr_context_save_buffers
xen_pfn_t mfns[MAX_BATCH_SIZE];
xen_pfn_t types[MAX_BATCH_SIZE];
int errors[MAX_BATCH_SIZE];
- void *guest_data[MAX_BATCH_SIZE];
void *local_pages[MAX_BATCH_SIZE];
struct iovec iov[MAX_BATCH_SIZE + 2]; /* headers + data */
uint64_t rec_pfns[MAX_BATCH_SIZE];
diff --git a/tools/libs/guest/xg_sr_save.c b/tools/libs/guest/xg_sr_save.c
index 7d8055a3f9e8..593268f176a6 100644
--- a/tools/libs/guest/xg_sr_save.c
+++ b/tools/libs/guest/xg_sr_save.c
@@ -88,7 +88,6 @@ static int write_batch(struct xc_sr_context *ctx)
xc_interface *xch = ctx->xch;
xen_pfn_t *mfns, *types;
void *guest_mapping = NULL;
- void **guest_data;
void **local_pages;
int *errors, rc = -1;
unsigned int i, p, nr_pages = 0, nr_pages_mapped = 0;
@@ -114,9 +113,6 @@ static int write_batch(struct xc_sr_context *ctx)
types = ctx->save.buffers->types;
/* Errors from attempting to map the gfns. */
errors = ctx->save.buffers->errors;
- /* Pointers to page data to send. Mapped gfns or local allocations. */
- guest_data = ctx->save.buffers->guest_data;
- memset(guest_data, 0, sizeof(*guest_data) * nr_pfns);
/* Pointers to locally allocated pages. Need freeing. */
local_pages = ctx->save.buffers->local_pages;
memset(local_pages, 0, sizeof(*local_pages) * nr_pfns);
@@ -159,6 +155,19 @@ static int write_batch(struct xc_sr_context *ctx)
mfns[nr_pages++] = mfns[i];
}
+ hdrs.rec.length = sizeof(hdrs.page_data);
+ hdrs.rec.length += nr_pfns * sizeof(*rec_pfns);
+
+ hdrs.page_data.count = nr_pfns;
+
+ iov[0].iov_base = &hdrs;
+ iov[0].iov_len = sizeof(hdrs);
+
+ iov[1].iov_base = rec_pfns;
+ iov[1].iov_len = nr_pfns * sizeof(*rec_pfns);
+
+ iovcnt = 2;
+
if ( nr_pages > 0 )
{
guest_mapping = xenforeignmemory_map(
@@ -200,60 +209,33 @@ static int write_batch(struct xc_sr_context *ctx)
else
goto err;
}
+ else if ( iov[iovcnt-1].iov_base + iov[iovcnt-1].iov_len != page )
+ {
+ iov[iovcnt].iov_base = page;
+ iov[iovcnt].iov_len = PAGE_SIZE;
+ iovcnt++;
+ }
else
- guest_data[i] = page;
+ {
+ iov[iovcnt-1].iov_len += PAGE_SIZE;
+ }
rc = -1;
++p;
}
}
- hdrs.rec.length = sizeof(hdrs.page_data);
- hdrs.rec.length += nr_pfns * sizeof(*rec_pfns);
hdrs.rec.length += nr_pages * PAGE_SIZE;
- hdrs.page_data.count = nr_pfns;
-
for ( i = 0; i < nr_pfns; ++i )
rec_pfns[i] = ((uint64_t)(types[i]) << 32) | ctx->save.batch_pfns[i];
- iov[0].iov_base = &hdrs;
- iov[0].iov_len = sizeof(hdrs);
-
- iov[1].iov_base = rec_pfns;
- iov[1].iov_len = nr_pfns * sizeof(*rec_pfns);
-
- iovcnt = 2;
-
- if ( nr_pages )
- {
- for ( i = 0; i < nr_pfns; ++i )
- {
- if ( !guest_data[i] )
- continue;
-
- if ( iov[iovcnt-1].iov_base + iov[iovcnt-1].iov_len !=
guest_data[i] )
- {
- iov[iovcnt].iov_base = guest_data[i];
- iov[iovcnt].iov_len = PAGE_SIZE;
- iovcnt++;
- }
- else
- {
- iov[iovcnt-1].iov_len += PAGE_SIZE;
- }
- --nr_pages;
- }
- }
-
if ( writev_exact(ctx->fd, iov, iovcnt) )
{
PERROR("Failed to write page data to stream");
goto err;
}
- /* Sanity check we have sent all the pages we expected to. */
- assert(nr_pages == 0);
rc = ctx->save.nr_batch_pfns = 0;
err:
--
2.54.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |