All of lore.kernel.org
 help / color / mirror / Atom feed
From: Juan Quintela <quintela@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Fam Zheng" <fam@euphon.net>,
	"Peter Maydell" <peter.maydell@linaro.org>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	"Jason Wang" <jasowang@redhat.com>,
	"Mark Cave-Ayland" <mark.cave-ayland@ilande.co.uk>,
	"Peter Xu" <peterx@redhat.com>,
	"Philippe Mathieu-Daudé" <f4bug@amsat.org>,
	"Gerd Hoffmann" <kraxel@redhat.com>,
	"Ani Sinha" <ani@anisinha.ca>,
	"Edgar E. Iglesias" <edgar.iglesias@gmail.com>,
	"Eric Blake" <eblake@redhat.com>,
	"Hannes Reinecke" <hare@suse.com>,
	"Vikram Garhwal" <fnu.vikram@xilinx.com>,
	qemu-block@nongnu.org, "Juan Quintela" <quintela@redhat.com>,
	"Daniel Henrique Barboza" <danielhb413@gmail.com>,
	"Markus Armbruster" <armbru@redhat.com>,
	"Artyom Tarasenko" <atar4qemu@gmail.com>,
	"Pavel Pisa" <pisa@cmp.felk.cvut.cz>,
	"Alistair Francis" <alistair@alistair23.me>,
	"Dr. David Alan Gilbert" <dgilbert@redhat.com>,
	"Greg Kurz" <groug@kaod.org>,
	qemu-arm@nongnu.org, "Cédric Le Goater" <clg@kaod.org>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Stafford Horne" <shorne@gmail.com>,
	"David Gibson" <david@gibson.dropbear.id.au>,
	"Laurent Vivier" <laurent@vivier.eu>,
	"Andrew Baumann" <Andrew.Baumann@microsoft.com>,
	qemu-ppc@nongnu.org, "Igor Mammedov" <imammedo@redhat.com>,
	"Aurelien Jarno" <aurelien@aurel32.net>
Subject: [PULL 15/38] multifd: Use normal pages array on the recv side
Date: Thu, 27 Jan 2022 16:05:25 +0100	[thread overview]
Message-ID: <20220127150548.20595-16-quintela@redhat.com> (raw)
In-Reply-To: <20220127150548.20595-1-quintela@redhat.com>

Signed-off-by: Juan Quintela <quintela@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>

---

Rename num_normal_pages to total_normal_pages (peter)
---
 migration/multifd.h      |  8 +++++--
 migration/multifd-zlib.c |  8 +++----
 migration/multifd-zstd.c |  6 +++---
 migration/multifd.c      | 45 ++++++++++++++++++----------------------
 4 files changed, 33 insertions(+), 34 deletions(-)

diff --git a/migration/multifd.h b/migration/multifd.h
index 7823199dbe..850889c5d8 100644
--- a/migration/multifd.h
+++ b/migration/multifd.h
@@ -151,12 +151,16 @@ typedef struct {
     uint32_t next_packet_size;
     /* packets sent through this channel */
     uint64_t num_packets;
-    /* pages sent through this channel */
-    uint64_t num_pages;
+    /* non zero pages recv through this channel */
+    uint64_t total_normal_pages;
     /* syncs main thread and channels */
     QemuSemaphore sem_sync;
     /* buffers to recv */
     struct iovec *iov;
+    /* Pages that are not zero */
+    ram_addr_t *normal;
+    /* num of non zero pages */
+    uint32_t normal_num;
     /* used for de-compression methods */
     void *data;
 } MultiFDRecvParams;
diff --git a/migration/multifd-zlib.c b/migration/multifd-zlib.c
index 7f4fbef2c9..8239c840d3 100644
--- a/migration/multifd-zlib.c
+++ b/migration/multifd-zlib.c
@@ -225,7 +225,7 @@ static int zlib_recv_pages(MultiFDRecvParams *p, Error **errp)
     uint32_t in_size = p->next_packet_size;
     /* we measure the change of total_out */
     uint32_t out_size = zs->total_out;
-    uint32_t expected_size = p->pages->num * qemu_target_page_size();
+    uint32_t expected_size = p->normal_num * page_size;
     uint32_t flags = p->flags & MULTIFD_FLAG_COMPRESSION_MASK;
     int ret;
     int i;
@@ -244,16 +244,16 @@ static int zlib_recv_pages(MultiFDRecvParams *p, Error **errp)
     zs->avail_in = in_size;
     zs->next_in = z->zbuff;
 
-    for (i = 0; i < p->pages->num; i++) {
+    for (i = 0; i < p->normal_num; i++) {
         int flush = Z_NO_FLUSH;
         unsigned long start = zs->total_out;
 
-        if (i == p->pages->num - 1) {
+        if (i == p->normal_num - 1) {
             flush = Z_SYNC_FLUSH;
         }
 
         zs->avail_out = page_size;
-        zs->next_out = p->pages->block->host + p->pages->offset[i];
+        zs->next_out = p->pages->block->host + p->normal[i];
 
         /*
          * Welcome to inflate semantics
diff --git a/migration/multifd-zstd.c b/migration/multifd-zstd.c
index 907d07805c..c5ed72ddcd 100644
--- a/migration/multifd-zstd.c
+++ b/migration/multifd-zstd.c
@@ -242,7 +242,7 @@ static int zstd_recv_pages(MultiFDRecvParams *p, Error **errp)
     uint32_t in_size = p->next_packet_size;
     uint32_t out_size = 0;
     size_t page_size = qemu_target_page_size();
-    uint32_t expected_size = p->pages->num * page_size;
+    uint32_t expected_size = p->normal_num * page_size;
     uint32_t flags = p->flags & MULTIFD_FLAG_COMPRESSION_MASK;
     struct zstd_data *z = p->data;
     int ret;
@@ -263,8 +263,8 @@ static int zstd_recv_pages(MultiFDRecvParams *p, Error **errp)
     z->in.size = in_size;
     z->in.pos = 0;
 
-    for (i = 0; i < p->pages->num; i++) {
-        z->out.dst = p->pages->block->host + p->pages->offset[i];
+    for (i = 0; i < p->normal_num; i++) {
+        z->out.dst = p->pages->block->host + p->normal[i];
         z->out.size = page_size;
         z->out.pos = 0;
 
diff --git a/migration/multifd.c b/migration/multifd.c
index 7b804928a2..e362b1bb89 100644
--- a/migration/multifd.c
+++ b/migration/multifd.c
@@ -146,11 +146,11 @@ static int nocomp_recv_pages(MultiFDRecvParams *p, Error **errp)
                    p->id, flags, MULTIFD_FLAG_NOCOMP);
         return -1;
     }
-    for (int i = 0; i < p->pages->num; i++) {
-        p->iov[i].iov_base = p->pages->block->host + p->pages->offset[i];
+    for (int i = 0; i < p->normal_num; i++) {
+        p->iov[i].iov_base = p->pages->block->host + p->normal[i];
         p->iov[i].iov_len = page_size;
     }
-    return qio_channel_readv_all(p->c, p->iov, p->pages->num, errp);
+    return qio_channel_readv_all(p->c, p->iov, p->normal_num, errp);
 }
 
 static MultiFDMethods multifd_nocomp_ops = {
@@ -282,7 +282,7 @@ static int multifd_recv_unfill_packet(MultiFDRecvParams *p, Error **errp)
 {
     MultiFDPacket_t *packet = p->packet;
     size_t page_size = qemu_target_page_size();
-    uint32_t pages_max = MULTIFD_PACKET_SIZE / page_size;
+    uint32_t page_count = MULTIFD_PACKET_SIZE / page_size;
     RAMBlock *block;
     int i;
 
@@ -309,33 +309,25 @@ static int multifd_recv_unfill_packet(MultiFDRecvParams *p, Error **errp)
      * If we received a packet that is 100 times bigger than expected
      * just stop migration.  It is a magic number.
      */
-    if (packet->pages_alloc > pages_max * 100) {
+    if (packet->pages_alloc > page_count) {
         error_setg(errp, "multifd: received packet "
-                   "with size %u and expected a maximum size of %u",
-                   packet->pages_alloc, pages_max * 100) ;
+                   "with size %u and expected a size of %u",
+                   packet->pages_alloc, page_count) ;
         return -1;
     }
-    /*
-     * We received a packet that is bigger than expected but inside
-     * reasonable limits (see previous comment).  Just reallocate.
-     */
-    if (packet->pages_alloc > p->pages->allocated) {
-        multifd_pages_clear(p->pages);
-        p->pages = multifd_pages_init(packet->pages_alloc);
-    }
 
-    p->pages->num = be32_to_cpu(packet->pages_used);
-    if (p->pages->num > packet->pages_alloc) {
+    p->normal_num = be32_to_cpu(packet->pages_used);
+    if (p->normal_num > packet->pages_alloc) {
         error_setg(errp, "multifd: received packet "
                    "with %u pages and expected maximum pages are %u",
-                   p->pages->num, packet->pages_alloc) ;
+                   p->normal_num, packet->pages_alloc) ;
         return -1;
     }
 
     p->next_packet_size = be32_to_cpu(packet->next_packet_size);
     p->packet_num = be64_to_cpu(packet->packet_num);
 
-    if (p->pages->num == 0) {
+    if (p->normal_num == 0) {
         return 0;
     }
 
@@ -349,7 +341,7 @@ static int multifd_recv_unfill_packet(MultiFDRecvParams *p, Error **errp)
     }
 
     p->pages->block = block;
-    for (i = 0; i < p->pages->num; i++) {
+    for (i = 0; i < p->normal_num; i++) {
         uint64_t offset = be64_to_cpu(packet->offset[i]);
 
         if (offset > (block->used_length - page_size)) {
@@ -358,7 +350,7 @@ static int multifd_recv_unfill_packet(MultiFDRecvParams *p, Error **errp)
                        offset, block->used_length);
             return -1;
         }
-        p->pages->offset[i] = offset;
+        p->normal[i] = offset;
     }
 
     return 0;
@@ -1022,6 +1014,8 @@ int multifd_load_cleanup(Error **errp)
         p->packet = NULL;
         g_free(p->iov);
         p->iov = NULL;
+        g_free(p->normal);
+        p->normal = NULL;
         multifd_recv_state->ops->recv_cleanup(p);
     }
     qemu_sem_destroy(&multifd_recv_state->sem_sync);
@@ -1095,13 +1089,13 @@ static void *multifd_recv_thread(void *opaque)
         flags = p->flags;
         /* recv methods don't know how to handle the SYNC flag */
         p->flags &= ~MULTIFD_FLAG_SYNC;
-        trace_multifd_recv(p->id, p->packet_num, p->pages->num, flags,
+        trace_multifd_recv(p->id, p->packet_num, p->normal_num, flags,
                            p->next_packet_size);
         p->num_packets++;
-        p->num_pages += p->pages->num;
+        p->total_normal_pages += p->normal_num;
         qemu_mutex_unlock(&p->mutex);
 
-        if (p->pages->num) {
+        if (p->normal_num) {
             ret = multifd_recv_state->ops->recv_pages(p, &local_err);
             if (ret != 0) {
                 break;
@@ -1123,7 +1117,7 @@ static void *multifd_recv_thread(void *opaque)
     qemu_mutex_unlock(&p->mutex);
 
     rcu_unregister_thread();
-    trace_multifd_recv_thread_end(p->id, p->num_packets, p->num_pages);
+    trace_multifd_recv_thread_end(p->id, p->num_packets, p->total_normal_pages);
 
     return NULL;
 }
@@ -1161,6 +1155,7 @@ int multifd_load_setup(Error **errp)
         p->packet = g_malloc0(p->packet_len);
         p->name = g_strdup_printf("multifdrecv_%d", i);
         p->iov = g_new0(struct iovec, page_count);
+        p->normal = g_new0(ram_addr_t, page_count);
     }
 
     for (i = 0; i < thread_count; i++) {
-- 
2.34.1



  parent reply	other threads:[~2022-01-27 15:49 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-01-27 15:05 [PULL 00/38] Migration 20220127 patches Juan Quintela
2022-01-27 15:05 ` [PULL 01/38] migration: All this fields are unsigned Juan Quintela
2022-01-27 15:05 ` [PULL 02/38] migration: We only need last_stage in two places Juan Quintela
2022-01-27 15:05 ` [PULL 03/38] migration: ram_release_pages() always receive 1 page as argument Juan Quintela
2022-01-27 15:05 ` [PULL 04/38] migration: Remove masking for compression Juan Quintela
2022-01-27 15:05 ` [PULL 05/38] migration: simplify do_compress_ram_page Juan Quintela
2022-01-27 15:05 ` [PULL 06/38] migration: Move ram_release_pages() call to save_zero_page_to_file() Juan Quintela
2022-01-27 15:05 ` [PULL 07/38] multifd: Use proper maximum compression values Juan Quintela
2022-01-27 15:05 ` [PULL 08/38] multifd: Move iov from pages to params Juan Quintela
2022-01-27 15:05 ` [PULL 09/38] multifd: Make zlib use iov's Juan Quintela
2022-01-27 15:05 ` [PULL 10/38] multifd: Make zstd " Juan Quintela
2022-01-27 15:05 ` [PULL 11/38] multifd: Remove send_write() method Juan Quintela
2022-01-27 15:05 ` [PULL 12/38] multifd: Use a single writev on the send side Juan Quintela
2022-01-27 15:05 ` [PULL 13/38] multifd: Unfold "used" variable by its value Juan Quintela
2022-01-27 15:05 ` [PULL 14/38] multifd: Use normal pages array on the send side Juan Quintela
2022-01-27 15:05 ` Juan Quintela [this message]
2022-01-27 15:05 ` [PULL 16/38] multifd: recv side only needs the RAMBlock host address Juan Quintela
2022-01-27 15:05 ` [PULL 17/38] multifd: Rename pages_used to normal_pages Juan Quintela
2022-01-27 15:05 ` [PULL 18/38] Remove unnecessary minimum_version_id_old fields Juan Quintela
2022-02-15 17:13   ` Peter Maydell
2022-02-15 17:34     ` Cédric Le Goater
2022-02-15 17:59       ` Peter Maydell
2022-01-27 15:05 ` [PULL 19/38] migration/migration.c: Add missed default error handler for migration state Juan Quintela
2022-01-27 15:05 ` [PULL 20/38] migration/migration.c: Avoid COLO boot in postcopy migration Juan Quintela
2022-01-27 15:05 ` [PULL 21/38] migration/migration.c: Remove the MIGRATION_STATUS_ACTIVE when migration finished Juan Quintela
2022-01-27 15:05 ` [PULL 22/38] migration: Report the error returned when save_live_iterate fails Juan Quintela
2022-01-27 15:05 ` [PULL 23/38] migration: Add canary to VMSTATE_END_OF_LIST Juan Quintela
2022-01-27 15:05 ` [PULL 24/38] migration: Perform vmsd structure check during tests Juan Quintela
2022-01-27 15:05 ` [PULL 25/38] migration/ram: clean up unused comment Juan Quintela
2022-01-27 15:05 ` [PULL 26/38] migration: Drop dead code of ram_debug_dump_bitmap() Juan Quintela
2022-01-27 15:05 ` [PULL 27/38] migration: Don't return for postcopy_chunk_hostpages() Juan Quintela
2022-01-27 15:05 ` [PULL 28/38] migration: Drop postcopy_chunk_hostpages() Juan Quintela
2022-01-27 15:05 ` [PULL 29/38] migration: Do chunk page in postcopy_each_ram_send_discard() Juan Quintela
2022-01-27 15:05 ` [PULL 30/38] migration: Drop return code for disgard ram process Juan Quintela
2022-01-27 15:05 ` [PULL 31/38] migration: Don't return for postcopy_send_discard_bm_ram() Juan Quintela
2022-01-27 15:05 ` [PULL 32/38] migration: Introduce ram_transferred_add() Juan Quintela
2022-01-27 15:05 ` [PULL 33/38] migration: Tally pre-copy, downtime and post-copy bytes independently Juan Quintela
2022-01-27 15:05 ` [PULL 34/38] migration: No off-by-one for pss->page update in host page size Juan Quintela
2022-01-27 15:05 ` [PULL 35/38] migration: Enable UFFD_FEATURE_THREAD_ID even without blocktime feat Juan Quintela
2022-01-27 15:05 ` [PULL 36/38] migration: Add postcopy_has_request() Juan Quintela
2022-01-27 15:05 ` [PULL 37/38] migration: Simplify unqueue_page() Juan Quintela
2022-01-27 15:05 ` [PULL 38/38] migration: Move temp page setup and cleanup into separate functions Juan Quintela
2022-01-28 11:05 ` [PULL 00/38] Migration 20220127 patches Peter Maydell
2022-01-31  9:03   ` Juan Quintela

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=20220127150548.20595-16-quintela@redhat.com \
    --to=quintela@redhat.com \
    --cc=Andrew.Baumann@microsoft.com \
    --cc=alistair@alistair23.me \
    --cc=ani@anisinha.ca \
    --cc=armbru@redhat.com \
    --cc=atar4qemu@gmail.com \
    --cc=aurelien@aurel32.net \
    --cc=clg@kaod.org \
    --cc=danielhb413@gmail.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=dgilbert@redhat.com \
    --cc=eblake@redhat.com \
    --cc=edgar.iglesias@gmail.com \
    --cc=f4bug@amsat.org \
    --cc=fam@euphon.net \
    --cc=fnu.vikram@xilinx.com \
    --cc=groug@kaod.org \
    --cc=hare@suse.com \
    --cc=imammedo@redhat.com \
    --cc=jasowang@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=laurent@vivier.eu \
    --cc=mark.cave-ayland@ilande.co.uk \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=peterx@redhat.com \
    --cc=pisa@cmp.felk.cvut.cz \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    --cc=shorne@gmail.com \
    /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.