From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Juan Quintela <quintela@redhat.com>
Cc: "Eduardo Habkost" <eduardo@habkost.net>,
qemu-devel@nongnu.org, "Peter Xu" <peterx@redhat.com>,
"Philippe Mathieu-Daudé" <f4bug@amsat.org>,
"Yanan Wang" <wangyanan55@huawei.com>,
"Leonardo Bras" <leobras@redhat.com>
Subject: Re: [PATCH v4 14/23] multifd: Use normal pages array on the send side
Date: Tue, 18 Jan 2022 18:41:35 +0000 [thread overview]
Message-ID: <YecJ3yebH9ucslep@work-vm> (raw)
In-Reply-To: <20220111130024.5392-15-quintela@redhat.com>
* Juan Quintela (quintela@redhat.com) wrote:
> We are only sending normal pages through multifd channels.
> Later on this series, we are going to also send zero pages.
> We are going to dectect if a page is zero or non zero in the multifd
^ typo
> channel thread, not on the main thread.
>
> So we receive an array of pages page->offset[N]
>
> And we will end with:
>
> p->normal[N - zero_pages]
> p->zero[zero_pages].
>
> In this patch, we just copy all the pages in offset to normal.
>
> for (i = 0; i < pages->num; i++) {
> p->narmal[p->normal_num] = pages->offset[i];
^
> p->normal_num++:
> }
>
> Later in the series this becomes:
>
> for (i = 0; i < pages->num; i++) {
> if (buffer_is_zero(page->offset[i])) {
> p->zerol[p->zero_num] = pages->offset[i];
^
> p->zero_num++:
> } else {
> p->narmal[p->normal_num] = pages->offset[i];
^
> p->normal_num++:
> }
> }
>
> Signed-off-by: Juan Quintela <quintela@redhat.com>
>
Other than typo's:
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> ---
>
> Improving comment (dave)
> Renaming num_normal_pages to total_normal_pages (peter)
> ---
> migration/multifd.h | 8 ++++++--
> migration/multifd-zlib.c | 6 +++---
> migration/multifd-zstd.c | 6 +++---
> migration/multifd.c | 30 +++++++++++++++++++-----------
> migration/trace-events | 4 ++--
> 5 files changed, 33 insertions(+), 21 deletions(-)
>
> diff --git a/migration/multifd.h b/migration/multifd.h
> index 7496f951a7..7823199dbe 100644
> --- a/migration/multifd.h
> +++ b/migration/multifd.h
> @@ -104,14 +104,18 @@ typedef struct {
> /* thread local variables */
> /* packets sent through this channel */
> uint64_t num_packets;
> - /* pages sent through this channel */
> - uint64_t num_pages;
> + /* non zero pages sent through this channel */
> + uint64_t total_normal_pages;
> /* syncs main thread and channels */
> QemuSemaphore sem_sync;
> /* buffers to send */
> struct iovec *iov;
> /* number of iovs used */
> uint32_t iovs_num;
> + /* Pages that are not zero */
> + ram_addr_t *normal;
> + /* num of non zero pages */
> + uint32_t normal_num;
> /* used for compression methods */
> void *data;
> } MultiFDSendParams;
> diff --git a/migration/multifd-zlib.c b/migration/multifd-zlib.c
> index ba90f1aaf4..7f4fbef2c9 100644
> --- a/migration/multifd-zlib.c
> +++ b/migration/multifd-zlib.c
> @@ -106,16 +106,16 @@ static int zlib_send_prepare(MultiFDSendParams *p, Error **errp)
> int ret;
> uint32_t i;
>
> - for (i = 0; i < p->pages->num; i++) {
> + for (i = 0; i < p->normal_num; i++) {
> uint32_t available = z->zbuff_len - out_size;
> int flush = Z_NO_FLUSH;
>
> - if (i == p->pages->num - 1) {
> + if (i == p->normal_num - 1) {
> flush = Z_SYNC_FLUSH;
> }
>
> zs->avail_in = page_size;
> - zs->next_in = p->pages->block->host + p->pages->offset[i];
> + zs->next_in = p->pages->block->host + p->normal[i];
>
> zs->avail_out = available;
> zs->next_out = z->zbuff + out_size;
> diff --git a/migration/multifd-zstd.c b/migration/multifd-zstd.c
> index 757434d1ee..907d07805c 100644
> --- a/migration/multifd-zstd.c
> +++ b/migration/multifd-zstd.c
> @@ -121,13 +121,13 @@ static int zstd_send_prepare(MultiFDSendParams *p, Error **errp)
> z->out.size = z->zbuff_len;
> z->out.pos = 0;
>
> - for (i = 0; i < p->pages->num; i++) {
> + for (i = 0; i < p->normal_num; i++) {
> ZSTD_EndDirective flush = ZSTD_e_continue;
>
> - if (i == p->pages->num - 1) {
> + if (i == p->normal_num - 1) {
> flush = ZSTD_e_flush;
> }
> - z->in.src = p->pages->block->host + p->pages->offset[i];
> + z->in.src = p->pages->block->host + p->normal[i];
> z->in.size = page_size;
> z->in.pos = 0;
>
> diff --git a/migration/multifd.c b/migration/multifd.c
> index e5b1fa5015..7b804928a2 100644
> --- a/migration/multifd.c
> +++ b/migration/multifd.c
> @@ -89,13 +89,13 @@ static int nocomp_send_prepare(MultiFDSendParams *p, Error **errp)
> MultiFDPages_t *pages = p->pages;
> size_t page_size = qemu_target_page_size();
>
> - for (int i = 0; i < p->pages->num; i++) {
> - p->iov[p->iovs_num].iov_base = pages->block->host + pages->offset[i];
> + for (int i = 0; i < p->normal_num; i++) {
> + p->iov[p->iovs_num].iov_base = pages->block->host + p->normal[i];
> p->iov[p->iovs_num].iov_len = page_size;
> p->iovs_num++;
> }
>
> - p->next_packet_size = p->pages->num * page_size;
> + p->next_packet_size = p->normal_num * page_size;
> p->flags |= MULTIFD_FLAG_NOCOMP;
> return 0;
> }
> @@ -262,7 +262,7 @@ static void multifd_send_fill_packet(MultiFDSendParams *p)
>
> packet->flags = cpu_to_be32(p->flags);
> packet->pages_alloc = cpu_to_be32(p->pages->allocated);
> - packet->pages_used = cpu_to_be32(p->pages->num);
> + packet->pages_used = cpu_to_be32(p->normal_num);
> packet->next_packet_size = cpu_to_be32(p->next_packet_size);
> packet->packet_num = cpu_to_be64(p->packet_num);
>
> @@ -270,9 +270,9 @@ static void multifd_send_fill_packet(MultiFDSendParams *p)
> strncpy(packet->ramblock, p->pages->block->idstr, 256);
> }
>
> - for (i = 0; i < p->pages->num; i++) {
> + for (i = 0; i < p->normal_num; i++) {
> /* there are architectures where ram_addr_t is 32 bit */
> - uint64_t temp = p->pages->offset[i];
> + uint64_t temp = p->normal[i];
>
> packet->offset[i] = cpu_to_be64(temp);
> }
> @@ -559,6 +559,8 @@ void multifd_save_cleanup(void)
> p->packet = NULL;
> g_free(p->iov);
> p->iov = NULL;
> + g_free(p->normal);
> + p->normal = NULL;
> multifd_send_state->ops->send_cleanup(p, &local_err);
> if (local_err) {
> migrate_set_error(migrate_get_current(), local_err);
> @@ -643,12 +645,17 @@ static void *multifd_send_thread(void *opaque)
> qemu_mutex_lock(&p->mutex);
>
> if (p->pending_job) {
> - uint32_t used = p->pages->num;
> uint64_t packet_num = p->packet_num;
> uint32_t flags = p->flags;
> p->iovs_num = 1;
> + p->normal_num = 0;
>
> - if (used) {
> + for (int i = 0; i < p->pages->num; i++) {
> + p->normal[p->normal_num] = p->pages->offset[i];
> + p->normal_num++;
> + }
> +
> + if (p->normal_num) {
> ret = multifd_send_state->ops->send_prepare(p, &local_err);
> if (ret != 0) {
> qemu_mutex_unlock(&p->mutex);
> @@ -658,12 +665,12 @@ static void *multifd_send_thread(void *opaque)
> multifd_send_fill_packet(p);
> p->flags = 0;
> p->num_packets++;
> - p->num_pages += used;
> + p->total_normal_pages += p->normal_num;
> p->pages->num = 0;
> p->pages->block = NULL;
> qemu_mutex_unlock(&p->mutex);
>
> - trace_multifd_send(p->id, packet_num, used, flags,
> + trace_multifd_send(p->id, packet_num, p->normal_num, flags,
> p->next_packet_size);
>
> p->iov[0].iov_len = p->packet_len;
> @@ -713,7 +720,7 @@ out:
> qemu_mutex_unlock(&p->mutex);
>
> rcu_unregister_thread();
> - trace_multifd_send_thread_end(p->id, p->num_packets, p->num_pages);
> + trace_multifd_send_thread_end(p->id, p->num_packets, p->total_normal_pages);
>
> return NULL;
> }
> @@ -913,6 +920,7 @@ int multifd_save_setup(Error **errp)
> p->tls_hostname = g_strdup(s->hostname);
> /* We need one extra place for the packet header */
> p->iov = g_new0(struct iovec, page_count + 1);
> + p->normal = g_new0(ram_addr_t, page_count);
> socket_send_channel_create(multifd_new_send_channel_async, p);
> }
>
> diff --git a/migration/trace-events b/migration/trace-events
> index 5172cb3b3d..171a83a55d 100644
> --- a/migration/trace-events
> +++ b/migration/trace-events
> @@ -124,13 +124,13 @@ multifd_recv_sync_main_wait(uint8_t id) "channel %u"
> multifd_recv_terminate_threads(bool error) "error %d"
> multifd_recv_thread_end(uint8_t id, uint64_t packets, uint64_t pages) "channel %u packets %" PRIu64 " pages %" PRIu64
> multifd_recv_thread_start(uint8_t id) "%u"
> -multifd_send(uint8_t id, uint64_t packet_num, uint32_t used, uint32_t flags, uint32_t next_packet_size) "channel %u packet_num %" PRIu64 " pages %u flags 0x%x next packet size %u"
> +multifd_send(uint8_t id, uint64_t packet_num, uint32_t normal, uint32_t flags, uint32_t next_packet_size) "channel %u packet_num %" PRIu64 " normal pages %u flags 0x%x next packet size %u"
> multifd_send_error(uint8_t id) "channel %u"
> multifd_send_sync_main(long packet_num) "packet num %ld"
> multifd_send_sync_main_signal(uint8_t id) "channel %u"
> multifd_send_sync_main_wait(uint8_t id) "channel %u"
> multifd_send_terminate_threads(bool error) "error %d"
> -multifd_send_thread_end(uint8_t id, uint64_t packets, uint64_t pages) "channel %u packets %" PRIu64 " pages %" PRIu64
> +multifd_send_thread_end(uint8_t id, uint64_t packets, uint64_t normal_pages) "channel %u packets %" PRIu64 " normal pages %" PRIu64
> multifd_send_thread_start(uint8_t id) "%u"
> multifd_tls_outgoing_handshake_start(void *ioc, void *tioc, const char *hostname) "ioc=%p tioc=%p hostname=%s"
> multifd_tls_outgoing_handshake_error(void *ioc, const char *err) "ioc=%p err=%s"
> --
> 2.34.1
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2022-01-18 19:13 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-11 13:00 [PATCH v4 00/23] Migration: Transmit and detect zero pages in the multifd threads Juan Quintela
2022-01-11 13:00 ` [PATCH v4 01/23] migration: All this fields are unsigned Juan Quintela
2022-01-11 13:00 ` [PATCH v4 02/23] migration: We only need last_stage in two places Juan Quintela
2022-01-11 13:00 ` [PATCH v4 03/23] migration: ram_release_pages() always receive 1 page as argument Juan Quintela
2022-01-11 13:00 ` [PATCH v4 04/23] migration: Remove masking for compression Juan Quintela
2022-01-11 19:56 ` Dr. David Alan Gilbert
2022-01-11 13:00 ` [PATCH v4 05/23] migration: simplify do_compress_ram_page Juan Quintela
2022-01-11 20:00 ` Dr. David Alan Gilbert
2022-01-11 13:00 ` [PATCH v4 06/23] migration: Move ram_release_pages() call to save_zero_page_to_file() Juan Quintela
2022-01-11 13:00 ` [PATCH v4 07/23] multifd: Use proper maximum compression values Juan Quintela
2022-01-13 13:27 ` Dr. David Alan Gilbert
2022-01-11 13:00 ` [PATCH v4 08/23] multifd: Move iov from pages to params Juan Quintela
2022-01-18 17:56 ` Dr. David Alan Gilbert
2022-01-25 9:31 ` Juan Quintela
2022-01-27 15:03 ` Dr. David Alan Gilbert
2022-01-11 13:00 ` [PATCH v4 09/23] multifd: Make zlib use iov's Juan Quintela
2022-01-11 13:00 ` [PATCH v4 10/23] multifd: Make zstd " Juan Quintela
2022-01-11 13:00 ` [PATCH v4 11/23] multifd: Remove send_write() method Juan Quintela
2022-01-18 18:22 ` Dr. David Alan Gilbert
2022-01-11 13:00 ` [PATCH v4 12/23] multifd: Use a single writev on the send side Juan Quintela
2022-01-11 13:00 ` [PATCH v4 13/23] multifd: Unfold "used" variable by its value Juan Quintela
2022-01-11 13:00 ` [PATCH v4 14/23] multifd: Use normal pages array on the send side Juan Quintela
2022-01-18 18:41 ` Dr. David Alan Gilbert [this message]
2022-01-11 13:00 ` [PATCH v4 15/23] multifd: Use normal pages array on the recv side Juan Quintela
2022-01-18 19:29 ` Dr. David Alan Gilbert
2022-01-11 13:00 ` [PATCH v4 16/23] multifd: recv side only needs the RAMBlock host address Juan Quintela
2022-01-11 13:00 ` [PATCH v4 17/23] multifd: Rename pages_used to normal_pages Juan Quintela
2022-01-11 13:00 ` [PATCH v4 18/23] migration: Make ram_save_target_page() a pointer Juan Quintela
2022-01-18 19:43 ` Dr. David Alan Gilbert
2022-01-11 13:00 ` [PATCH v4 19/23] multifd: Add property to enable/disable zero_page Juan Quintela
2022-01-18 19:38 ` Dr. David Alan Gilbert
2022-01-11 13:00 ` [PATCH v4 20/23] multifd: Support for zero pages transmission Juan Quintela
2022-01-18 19:49 ` Dr. David Alan Gilbert
2022-01-11 13:00 ` [PATCH v4 21/23] multifd: Zero " Juan Quintela
2022-01-18 19:55 ` Dr. David Alan Gilbert
2022-01-25 9:42 ` Juan Quintela
2022-01-27 15:13 ` Dr. David Alan Gilbert
2022-01-27 15:26 ` Juan Quintela
2022-01-11 13:00 ` [PATCH v4 22/23] migration: Use multifd before we check for the zero page Juan Quintela
2022-01-18 20:01 ` Dr. David Alan Gilbert
2022-01-25 9:45 ` Juan Quintela
2022-01-11 13:00 ` [PATCH v4 23/23] migration: Export ram_release_page() Juan Quintela
2022-01-18 20:02 ` Dr. David Alan Gilbert
2022-01-25 10:02 ` 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=YecJ3yebH9ucslep@work-vm \
--to=dgilbert@redhat.com \
--cc=eduardo@habkost.net \
--cc=f4bug@amsat.org \
--cc=leobras@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=wangyanan55@huawei.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.