All of lore.kernel.org
 help / color / mirror / Atom feed
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xenproject.org
Cc: Olaf Hering <olaf@aepfle.de>, Ian Jackson <iwj@xenproject.org>,
	Wei Liu <wl@xen.org>, Juergen Gross <jgross@suse.com>
Subject: [PATCH v20210713 08/31] tools: save: preallocate types array
Date: Tue, 13 Jul 2021 20:05:42 +0200	[thread overview]
Message-ID: <20210713180605.12096-9-olaf@aepfle.de> (raw)
In-Reply-To: <20210713180605.12096-1-olaf@aepfle.de>

Remove repeated allocation from migration loop. There will never be
more than MAX_BATCH_SIZE pages to process in a batch.
Allocate the space once.

Signed-off-by: Olaf Hering <olaf@aepfle.de>
---
 tools/libs/guest/xg_sr_common.h |  1 +
 tools/libs/guest/xg_sr_save.c   | 28 +++++++++++++---------------
 2 files changed, 14 insertions(+), 15 deletions(-)

diff --git a/tools/libs/guest/xg_sr_common.h b/tools/libs/guest/xg_sr_common.h
index fc403adc64..d80de6e7da 100644
--- a/tools/libs/guest/xg_sr_common.h
+++ b/tools/libs/guest/xg_sr_common.h
@@ -245,6 +245,7 @@ struct xc_sr_context
 
             xen_pfn_t *batch_pfns;
             xen_pfn_t *mfns;
+            xen_pfn_t *types;
             unsigned int nr_batch_pfns;
             unsigned long *deferred_pages;
             unsigned long nr_deferred_pages;
diff --git a/tools/libs/guest/xg_sr_save.c b/tools/libs/guest/xg_sr_save.c
index 0abe63a377..29a5fe82f0 100644
--- a/tools/libs/guest/xg_sr_save.c
+++ b/tools/libs/guest/xg_sr_save.c
@@ -88,7 +88,6 @@ static int write_checkpoint_record(struct xc_sr_context *ctx)
 static int write_batch(struct xc_sr_context *ctx)
 {
     xc_interface *xch = ctx->xch;
-    xen_pfn_t *types = NULL;
     void *guest_mapping = NULL;
     void **guest_data = NULL;
     void **local_pages = NULL;
@@ -105,8 +104,6 @@ static int write_batch(struct xc_sr_context *ctx)
 
     assert(nr_pfns != 0);
 
-    /* Types of the batch pfns. */
-    types = malloc(nr_pfns * sizeof(*types));
     /* Errors from attempting to map the gfns. */
     errors = malloc(nr_pfns * sizeof(*errors));
     /* Pointers to page data to send.  Mapped gfns or local allocations. */
@@ -116,7 +113,7 @@ static int write_batch(struct xc_sr_context *ctx)
     /* iovec[] for writev(). */
     iov = malloc((nr_pfns + 4) * sizeof(*iov));
 
-    if ( !types || !errors || !guest_data || !local_pages || !iov )
+    if ( !errors || !guest_data || !local_pages || !iov )
     {
         ERROR("Unable to allocate arrays for a batch of %u pages",
               nr_pfns);
@@ -125,7 +122,7 @@ static int write_batch(struct xc_sr_context *ctx)
 
     for ( i = 0; i < nr_pfns; ++i )
     {
-        types[i] = ctx->save.mfns[i] = ctx->save.ops.pfn_to_gfn(ctx,
+        ctx->save.types[i] = ctx->save.mfns[i] = ctx->save.ops.pfn_to_gfn(ctx,
                                                       ctx->save.batch_pfns[i]);
 
         /* Likely a ballooned page. */
@@ -136,7 +133,7 @@ static int write_batch(struct xc_sr_context *ctx)
         }
     }
 
-    rc = xc_get_pfn_type_batch(xch, ctx->domid, nr_pfns, types);
+    rc = xc_get_pfn_type_batch(xch, ctx->domid, nr_pfns, ctx->save.types);
     if ( rc )
     {
         PERROR("Failed to get types for pfn batch");
@@ -146,14 +143,14 @@ static int write_batch(struct xc_sr_context *ctx)
 
     for ( i = 0; i < nr_pfns; ++i )
     {
-        if ( !is_known_page_type(types[i]) )
+        if ( !is_known_page_type(ctx->save.types[i]) )
         {
             ERROR("Unknown type %#"PRIpfn" for pfn %#"PRIpfn,
-                  types[i], ctx->save.mfns[i]);
+                  ctx->save.types[i], ctx->save.mfns[i]);
             goto err;
         }
 
-        if ( !page_type_has_stream_data(types[i]) )
+        if ( !page_type_has_stream_data(ctx->save.types[i]) )
             continue;
 
         ctx->save.mfns[nr_pages++] = ctx->save.mfns[i];
@@ -172,7 +169,7 @@ static int write_batch(struct xc_sr_context *ctx)
 
         for ( i = 0, p = 0; i < nr_pfns; ++i )
         {
-            if ( !page_type_has_stream_data(types[i]) )
+            if ( !page_type_has_stream_data(ctx->save.types[i]) )
                 continue;
 
             if ( errors[p] )
@@ -183,7 +180,7 @@ static int write_batch(struct xc_sr_context *ctx)
             }
 
             orig_page = page = guest_mapping + (p * PAGE_SIZE);
-            rc = ctx->save.ops.normalise_page(ctx, types[i], &page);
+            rc = ctx->save.ops.normalise_page(ctx, ctx->save.types[i], &page);
 
             if ( orig_page != page )
                 local_pages[i] = page;
@@ -194,7 +191,7 @@ static int write_batch(struct xc_sr_context *ctx)
                 {
                     set_bit(ctx->save.batch_pfns[i], ctx->save.deferred_pages);
                     ++ctx->save.nr_deferred_pages;
-                    types[i] = XEN_DOMCTL_PFINFO_XTAB;
+                    ctx->save.types[i] = XEN_DOMCTL_PFINFO_XTAB;
                     --nr_pages;
                 }
                 else
@@ -223,7 +220,7 @@ static int write_batch(struct xc_sr_context *ctx)
     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)(ctx->save.types[i]) << 32) | ctx->save.batch_pfns[i];
 
     iov[0].iov_base = &rec.type;
     iov[0].iov_len = sizeof(rec.type);
@@ -275,7 +272,6 @@ static int write_batch(struct xc_sr_context *ctx)
     free(local_pages);
     free(guest_data);
     free(errors);
-    free(types);
 
     return rc;
 }
@@ -850,9 +846,10 @@ static int setup(struct xc_sr_context *ctx)
     ctx->save.batch_pfns = malloc(MAX_BATCH_SIZE *
                                   sizeof(*ctx->save.batch_pfns));
     ctx->save.mfns = malloc(MAX_BATCH_SIZE * sizeof(*ctx->save.mfns));
+    ctx->save.types = malloc(MAX_BATCH_SIZE * sizeof(*ctx->save.types));
     ctx->save.deferred_pages = bitmap_alloc(ctx->save.p2m_size);
 
-    if ( !ctx->save.batch_pfns || !ctx->save.mfns ||
+    if ( !ctx->save.batch_pfns || !ctx->save.mfns || !ctx->save.types ||
          !dirty_bitmap || !ctx->save.deferred_pages )
     {
         ERROR("Unable to allocate memory for dirty bitmaps, batch pfns and"
@@ -884,6 +881,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.types);
     free(ctx->save.mfns);
     free(ctx->save.batch_pfns);
 }


  parent reply	other threads:[~2021-07-13 18:06 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-13 18:05 [PATCH v20210713 00/31] leftover from 2020 Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 01/31] tools: fix make rpmball Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 02/31] hotplug/Linux: fix starting of xenstored with restarting systemd Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 03/31] tools: add API to work with sevaral bits at once Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 04/31] xl: fix description of migrate --debug Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 05/31] tools: add readv_exact to libxenctrl Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 06/31] tools: show migration transfer rate in send_dirty_pages Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 07/31] tools: save: preallocate mfns array Olaf Hering
2021-07-13 18:05 ` Olaf Hering [this message]
2021-07-13 18:05 ` [PATCH v20210713 09/31] tools: save: preallocate errors array Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 10/31] tools: save: preallocate iov array Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 11/31] tools: save: preallocate rec_pfns array Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 12/31] tools: save: preallocate guest_data array Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 13/31] tools: save: preallocate local_pages array Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 14/31] tools: restore: preallocate pfns array Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 15/31] tools: restore: preallocate types array Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 16/31] tools: restore: preallocate mfns array Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 17/31] tools: restore: preallocate map_errs array Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 18/31] tools: restore: preallocate populate_pfns pfns array Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 19/31] tools: restore: preallocate populate_pfns mfns array Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 20/31] tools: restore: split record processing Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 21/31] tools: restore: split handle_page_data Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 22/31] tools: restore: write data directly into guest Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 23/31] tools: recognize LIBXL_API_VERSION for 4.16 Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 24/31] tools: adjust libxl_domain_suspend to receive a struct props Olaf Hering
2021-07-13 18:05 ` [PATCH v20210713 25/31] tools: add callback to libxl for precopy_policy and precopy_stats Olaf Hering
2021-07-13 18:06 ` [PATCH v20210713 26/31] tools: add --max_iters to libxl_domain_suspend Olaf Hering
2021-07-13 18:06 ` [PATCH v20210713 27/31] tools: add --min_remaining " Olaf Hering
2021-07-13 18:06 ` [PATCH v20210713 28/31] tools: add --abort_if_busy " Olaf Hering
2021-07-13 18:06 ` [PATCH v20210713 29/31] tools: add API for expandable bitmaps Olaf Hering
2021-07-13 18:06 ` [PATCH v20210713 30/31] tools: use xg_sr_bitmap for populated_pfns Olaf Hering
2021-07-13 18:06 ` [PATCH v20210713 31/31] tools: use superpages during restore of HVM guest Olaf Hering

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210713180605.12096-9-olaf@aepfle.de \
    --to=olaf@aepfle.de \
    --cc=iwj@xenproject.org \
    --cc=jgross@suse.com \
    --cc=wl@xen.org \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.