From: David Edmondson <david.edmondson@oracle.com>
To: Juan Quintela <quintela@redhat.com>, qemu-devel@nongnu.org
Cc: "Peter Xu" <peterx@redhat.com>, "Greg Kurz" <groug@kaod.org>,
qemu-s390x@nongnu.org, "Fam Zheng" <fam@euphon.net>,
"Ilya Leoshkevich" <iii@linux.ibm.com>,
"Halil Pasic" <pasic@linux.ibm.com>,
"John Snow" <jsnow@redhat.com>,
qemu-ppc@nongnu.org,
"Daniel Henrique Barboza" <danielhb413@gmail.com>,
"Harsh Prateek Bora" <harshpb@linux.ibm.com>,
"Christian Borntraeger" <borntraeger@linux.ibm.com>,
"Richard Henderson" <richard.henderson@linaro.org>,
"David Gibson" <david@gibson.dropbear.id.au>,
"David Hildenbrand" <david@redhat.com>,
"Stefan Hajnoczi" <stefanha@redhat.com>,
"Eric Farman" <farman@linux.ibm.com>,
qemu-block@nongnu.org, "Cédric Le Goater" <clg@kaod.org>,
"Eric Blake" <eblake@redhat.com>,
"Leonardo Bras" <leobras@redhat.com>,
"Thomas Huth" <thuth@redhat.com>,
"Juan Quintela" <quintela@redhat.com>,
"Vladimir Sementsov-Ogievskiy" <vsementsov@yandex-team.ru>
Subject: Re: [PATCH v2 02/16] migration: Correct transferred bytes value
Date: Tue, 16 May 2023 10:35:47 +0100 [thread overview]
Message-ID: <m2bkik4o0c.fsf@oracle.com> (raw)
In-Reply-To: <20230515195709.63843-3-quintela@redhat.com>
Juan Quintela <quintela@redhat.com> writes:
> We forget several places to add to trasferred amount of data. With
"transferred".
> this fixes I get:
>
> qemu_file_transferred() + multifd_bytes == transferred
>
> The only place whrer this is not true is during devices sending. But
"where"
> going all through the full tree searching for devices that use
> QEMUFile directly is a bit too much.
>
> Multifd, precopy and xbzrle work as expected. Postocpy still misses 35
> bytes, but searching for them is getting complicated, so I stop here.
>
> Signed-off-by: Juan Quintela <quintela@redhat.com>
> ---
> migration/ram.c | 14 ++++++++++++++
> migration/savevm.c | 19 +++++++++++++++++--
> migration/vmstate.c | 3 +++
> migration/meson.build | 2 +-
> 4 files changed, 35 insertions(+), 3 deletions(-)
>
> diff --git a/migration/ram.c b/migration/ram.c
> index f69d8d42b0..fd5a8db0f8 100644
> --- a/migration/ram.c
> +++ b/migration/ram.c
> @@ -337,6 +337,7 @@ int64_t ramblock_recv_bitmap_send(QEMUFile *file,
>
> g_free(le_bitmap);
>
> + stat64_add(&mig_stats.transferred, 8 + size + 8);
Push this up after the qemu_fflush() call?
> if (qemu_file_get_error(file)) {
> return qemu_file_get_error(file);
> }
> @@ -1392,6 +1393,7 @@ static int find_dirty_block(RAMState *rs, PageSearchStatus *pss)
> return ret;
> }
> qemu_put_be64(f, RAM_SAVE_FLAG_MULTIFD_FLUSH);
> + stat64_add(&mig_stats.transferred, 8);
> qemu_fflush(f);
> }
> /*
> @@ -3020,6 +3022,7 @@ static int ram_save_setup(QEMUFile *f, void *opaque)
> RAMState **rsp = opaque;
> RAMBlock *block;
> int ret;
> + size_t size = 0;
>
> if (compress_threads_save_setup()) {
> return -1;
> @@ -3038,16 +3041,20 @@ static int ram_save_setup(QEMUFile *f, void *opaque)
> qemu_put_be64(f, ram_bytes_total_with_ignored()
> | RAM_SAVE_FLAG_MEM_SIZE);
>
> + size += 8;
Move the blank line down.
> RAMBLOCK_FOREACH_MIGRATABLE(block) {
> qemu_put_byte(f, strlen(block->idstr));
> qemu_put_buffer(f, (uint8_t *)block->idstr, strlen(block->idstr));
> qemu_put_be64(f, block->used_length);
> + size += 1 + strlen(block->idstr) + 8;
> if (migrate_postcopy_ram() && block->page_size !=
> qemu_host_page_size) {
> qemu_put_be64(f, block->page_size);
> + size += 8;
> }
> if (migrate_ignore_shared()) {
> qemu_put_be64(f, block->mr->addr);
> + size += 8;
> }
> }
> }
> @@ -3064,11 +3071,14 @@ static int ram_save_setup(QEMUFile *f, void *opaque)
>
> if (!migrate_multifd_flush_after_each_section()) {
> qemu_put_be64(f, RAM_SAVE_FLAG_MULTIFD_FLUSH);
> + size += 8;
> }
>
> qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
> + size += 8;
> qemu_fflush(f);
>
> + stat64_add(&mig_stats.transferred, size);
> return 0;
> }
>
> @@ -3209,6 +3219,7 @@ static int ram_save_complete(QEMUFile *f, void *opaque)
> RAMState **temp = opaque;
> RAMState *rs = *temp;
> int ret = 0;
> + size_t size = 0;
>
> rs->last_stage = !migration_in_colo_state();
>
> @@ -3253,8 +3264,11 @@ static int ram_save_complete(QEMUFile *f, void *opaque)
>
> if (!migrate_multifd_flush_after_each_section()) {
> qemu_put_be64(f, RAM_SAVE_FLAG_MULTIFD_FLUSH);
> + size += 8;
> }
> qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
> + size += 8;
> + stat64_add(&mig_stats.transferred, size);
This is after qemu_fflush() in the other cases.
> qemu_fflush(f);
>
> return 0;
> diff --git a/migration/savevm.c b/migration/savevm.c
> index e33788343a..c7af9050c2 100644
> --- a/migration/savevm.c
> +++ b/migration/savevm.c
> @@ -952,6 +952,7 @@ static void save_section_header(QEMUFile *f, SaveStateEntry *se,
> qemu_put_byte(f, section_type);
> qemu_put_be32(f, se->section_id);
>
> + size_t size = 1 + 4;
Move the blank line down.
> if (section_type == QEMU_VM_SECTION_FULL ||
> section_type == QEMU_VM_SECTION_START) {
> /* ID string */
> @@ -961,7 +962,9 @@ static void save_section_header(QEMUFile *f, SaveStateEntry *se,
>
> qemu_put_be32(f, se->instance_id);
> qemu_put_be32(f, se->version_id);
> + size += 1 + len + 4 + 4;
> }
> + stat64_add(&mig_stats.transferred, size);
> }
>
> /*
> @@ -973,6 +976,7 @@ static void save_section_footer(QEMUFile *f, SaveStateEntry *se)
> if (migrate_get_current()->send_section_footer) {
> qemu_put_byte(f, QEMU_VM_SECTION_FOOTER);
> qemu_put_be32(f, se->section_id);
> + stat64_add(&mig_stats.transferred, 1 + 4);
> }
> }
>
> @@ -1032,6 +1036,7 @@ static void qemu_savevm_command_send(QEMUFile *f,
> qemu_put_be16(f, (uint16_t)command);
> qemu_put_be16(f, len);
> qemu_put_buffer(f, data, len);
> + stat64_add(&mig_stats.transferred, 1 + 2 + 2 + len);
> qemu_fflush(f);
> }
>
> @@ -1212,11 +1217,13 @@ void qemu_savevm_state_header(QEMUFile *f)
> trace_savevm_state_header();
> qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
> qemu_put_be32(f, QEMU_VM_FILE_VERSION);
> -
> + size_t size = 4 + 4;
Move the blank line down.
> if (migrate_get_current()->send_configuration) {
> qemu_put_byte(f, QEMU_VM_CONFIGURATION);
> + size += 1;
> vmstate_save_state(f, &vmstate_configuration, &savevm_state, 0);
> }
> + stat64_add(&mig_stats.transferred, size);
> }
>
> bool qemu_savevm_state_guest_unplug_pending(void)
> @@ -1384,6 +1391,7 @@ void qemu_savevm_state_complete_postcopy(QEMUFile *f)
> {
> SaveStateEntry *se;
> int ret;
> + size_t size = 0;
>
> QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> if (!se->ops || !se->ops->save_live_complete_postcopy) {
> @@ -1398,7 +1406,7 @@ void qemu_savevm_state_complete_postcopy(QEMUFile *f)
> /* Section type */
> qemu_put_byte(f, QEMU_VM_SECTION_END);
> qemu_put_be32(f, se->section_id);
> -
> + size += 1 + 4;
Move the blank line down.
> ret = se->ops->save_live_complete_postcopy(f, se->opaque);
> trace_savevm_section_end(se->idstr, se->section_id, ret);
> save_section_footer(f, se);
> @@ -1409,6 +1417,8 @@ void qemu_savevm_state_complete_postcopy(QEMUFile *f)
> }
>
> qemu_put_byte(f, QEMU_VM_EOF);
> + size += 1;
> + stat64_add(&mig_stats.transferred, size);
> qemu_fflush(f);
> }
>
> @@ -1484,6 +1494,7 @@ int qemu_savevm_state_complete_precopy_non_iterable(QEMUFile *f,
> if (!in_postcopy) {
> /* Postcopy stream will still be going */
> qemu_put_byte(f, QEMU_VM_EOF);
> + stat64_add(&mig_stats.transferred, 1);
> }
>
> json_writer_end_array(vmdesc);
> @@ -1664,15 +1675,18 @@ void qemu_savevm_live_state(QEMUFile *f)
> /* save QEMU_VM_SECTION_END section */
> qemu_savevm_state_complete_precopy(f, true, false);
> qemu_put_byte(f, QEMU_VM_EOF);
> + stat64_add(&mig_stats.transferred, 1);
> }
>
> int qemu_save_device_state(QEMUFile *f)
> {
> SaveStateEntry *se;
> + size_t size = 0;
>
> if (!migration_in_colo_state()) {
> qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
> qemu_put_be32(f, QEMU_VM_FILE_VERSION);
> + size = 4 + 4;
> }
> cpu_synchronize_all_states();
>
> @@ -1690,6 +1704,7 @@ int qemu_save_device_state(QEMUFile *f)
>
> qemu_put_byte(f, QEMU_VM_EOF);
>
> + stat64_add(&mig_stats.transferred, size + 1);
Move the blank line down. In other cases the pattern has been to update
'size' and then call stat64_add() - make this one the same?
> return qemu_file_get_error(f);
> }
>
> diff --git a/migration/vmstate.c b/migration/vmstate.c
> index af01d54b6f..ee3b70a6a8 100644
> --- a/migration/vmstate.c
> +++ b/migration/vmstate.c
> @@ -12,6 +12,7 @@
>
> #include "qemu/osdep.h"
> #include "migration.h"
> +#include "migration-stats.h"
> #include "migration/vmstate.h"
> #include "savevm.h"
> #include "qapi/qmp/json-writer.h"
> @@ -394,6 +395,7 @@ int vmstate_save_state_v(QEMUFile *f, const VMStateDescription *vmsd,
> written_bytes = qemu_file_transferred_fast(f) - old_offset;
> vmsd_desc_field_end(vmsd, vmdesc_loop, field, written_bytes, i);
>
> + stat64_add(&mig_stats.transferred, written_bytes);
Move the blank line down.
> /* Compressed arrays only care about the first element */
> if (vmdesc_loop && vmsd_can_compress(field)) {
> vmdesc_loop = NULL;
> @@ -517,6 +519,7 @@ static int vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
> qemu_put_byte(f, len);
> qemu_put_buffer(f, (uint8_t *)vmsdsub->name, len);
> qemu_put_be32(f, vmsdsub->version_id);
> + stat64_add(&mig_stats.transferred, 1 + 1 + len + 4);
> ret = vmstate_save_state(f, vmsdsub, opaque, vmdesc);
> if (ret) {
> return ret;
> diff --git a/migration/meson.build b/migration/meson.build
> index dc8b1daef5..b3d0c537c8 100644
> --- a/migration/meson.build
> +++ b/migration/meson.build
> @@ -1,5 +1,6 @@
> # Files needed by unit tests
> migration_files = files(
> + 'migration-stats.c',
> 'page_cache.c',
> 'xbzrle.c',
> 'vmstate-types.c',
> @@ -18,7 +19,6 @@ softmmu_ss.add(files(
> 'fd.c',
> 'global_state.c',
> 'migration-hmp-cmds.c',
> - 'migration-stats.c',
> 'migration.c',
> 'multifd.c',
> 'multifd-zlib.c',
> --
> 2.40.1
--
Are you laughing at me now? May I please laugh along with you.
next prev parent reply other threads:[~2023-05-16 9:36 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-15 19:56 [PATCH v2 00/16] Migration: More migration atomic counters Juan Quintela
2023-05-15 19:56 ` [PATCH v2 01/16] migration: Don't use INT64_MAX for unlimited rate Juan Quintela
2023-05-16 4:49 ` Harsh Prateek Bora
2023-05-16 9:13 ` David Edmondson
2023-05-16 9:24 ` Juan Quintela
2023-05-16 9:55 ` David Edmondson
2023-05-16 12:47 ` Cédric Le Goater
2023-05-23 1:57 ` Leonardo Brás
2023-05-15 19:56 ` [PATCH v2 02/16] migration: Correct transferred bytes value Juan Quintela
2023-05-16 9:35 ` David Edmondson [this message]
2023-05-23 2:15 ` Leonardo Brás
2023-05-26 8:04 ` Juan Quintela
2023-05-26 18:50 ` Leonardo Bras Soares Passos
2023-05-30 10:30 ` Juan Quintela
2023-05-15 19:56 ` [PATCH v2 03/16] migration: Move setup_time to mig_stats Juan Quintela
2023-05-16 9:42 ` David Edmondson
2023-05-16 10:06 ` Juan Quintela
2023-05-16 11:07 ` David Edmondson
2023-05-25 1:18 ` Leonardo Brás
2023-05-26 8:07 ` Juan Quintela
2023-05-26 18:53 ` Leonardo Bras Soares Passos
2023-05-15 19:56 ` [PATCH v2 04/16] qemu-file: Account for rate_limit usage on qemu_fflush() Juan Quintela
2023-05-25 1:33 ` Leonardo Brás
2023-05-26 8:09 ` Juan Quintela
2023-05-26 18:54 ` Leonardo Bras Soares Passos
2023-05-15 19:56 ` [PATCH v2 05/16] migration: Move rate_limit_max and rate_limit_used to migration_stats Juan Quintela
2023-05-16 12:43 ` Cédric Le Goater
2023-05-25 3:06 ` Leonardo Brás
2023-05-15 19:56 ` [PATCH v2 06/16] migration: Move migration_total_bytes() to migration-stats.c Juan Quintela
2023-05-25 3:09 ` Leonardo Brás
2023-05-15 19:57 ` [PATCH v2 07/16] migration: Add a trace for migration_transferred_bytes Juan Quintela
2023-05-25 3:18 ` Leonardo Brás
2023-05-15 19:57 ` [PATCH v2 08/16] migration: Use migration_transferred_bytes() to calculate rate_limit Juan Quintela
2023-05-25 6:50 ` Leonardo Brás
2023-05-26 8:17 ` Juan Quintela
2023-05-26 18:59 ` Leonardo Bras Soares Passos
2023-05-15 19:57 ` [PATCH v2 09/16] migration: We don't need the field rate_limit_used anymore Juan Quintela
2023-05-25 6:50 ` Leonardo Brás
2023-05-26 8:18 ` Juan Quintela
2023-05-26 18:59 ` Leonardo Bras Soares Passos
2023-05-15 19:57 ` [PATCH v2 10/16] migration: Don't abuse qemu_file transferred for RDMA Juan Quintela
2023-05-25 6:53 ` Leonardo Brás
2023-05-15 19:57 ` [PATCH v2 11/16] migration/RDMA: It is accounting for zero/normal pages in two places Juan Quintela
2023-05-25 7:06 ` Leonardo Brás
2023-05-15 19:57 ` [PATCH v2 12/16] migration/rdma: Remove QEMUFile parameter when not used Juan Quintela
2023-05-25 7:21 ` Leonardo Brás
2023-05-15 19:57 ` [PATCH v2 13/16] migration/rdma: Don't use imaginary transfers Juan Quintela
2023-05-25 7:27 ` Leonardo Brás
2023-05-15 19:57 ` [PATCH v2 14/16] migration: Remove unused qemu_file_credit_transfer() Juan Quintela
2023-05-25 7:29 ` Leonardo Brás
2023-05-15 19:57 ` [PATCH v2 15/16] migration/rdma: Simplify the function that saves a page Juan Quintela
2023-05-25 8:10 ` Leonardo Brás
2023-05-26 8:21 ` Juan Quintela
2023-05-26 19:03 ` Leonardo Bras Soares Passos
2023-05-15 19:57 ` [PATCH v2 16/16] migration/multifd: Compute transferred bytes correctly Juan Quintela
2023-05-25 8:38 ` Leonardo Brás
2023-05-26 8:23 ` Juan Quintela
2023-05-26 19:04 ` Leonardo Bras Soares Passos
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=m2bkik4o0c.fsf@oracle.com \
--to=david.edmondson@oracle.com \
--cc=borntraeger@linux.ibm.com \
--cc=clg@kaod.org \
--cc=danielhb413@gmail.com \
--cc=david@gibson.dropbear.id.au \
--cc=david@redhat.com \
--cc=eblake@redhat.com \
--cc=fam@euphon.net \
--cc=farman@linux.ibm.com \
--cc=groug@kaod.org \
--cc=harshpb@linux.ibm.com \
--cc=iii@linux.ibm.com \
--cc=jsnow@redhat.com \
--cc=leobras@redhat.com \
--cc=pasic@linux.ibm.com \
--cc=peterx@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=qemu-s390x@nongnu.org \
--cc=quintela@redhat.com \
--cc=richard.henderson@linaro.org \
--cc=stefanha@redhat.com \
--cc=thuth@redhat.com \
--cc=vsementsov@yandex-team.ru \
/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.