From: Juan Quintela <quintela@redhat.com>
To: Avihai Horon <avihaih@nvidia.com>
Cc: qemu-devel@nongnu.org,
"Alex Williamson" <alex.williamson@redhat.com>,
"Cédric Le Goater" <clg@redhat.com>,
"Peter Xu" <peterx@redhat.com>,
"Leonardo Bras" <leobras@redhat.com>,
"Eric Blake" <eblake@redhat.com>,
"Markus Armbruster" <armbru@redhat.com>,
"Thomas Huth" <thuth@redhat.com>,
"Laurent Vivier" <lvivier@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Yishai Hadas" <yishaih@nvidia.com>,
"Jason Gunthorpe" <jgg@nvidia.com>,
"Maor Gottlieb" <maorg@nvidia.com>,
"Kirti Wankhede" <kwankhede@nvidia.com>,
"Tarun Gupta" <targupta@nvidia.com>,
"Joao Martins" <joao.m.martins@oracle.com>
Subject: Re: [PATCH 3/8] migration: Add precopy initial data loaded ACK functionality
Date: Wed, 10 May 2023 10:54:37 +0200 [thread overview]
Message-ID: <87cz38a7n6.fsf@secure.mitica> (raw)
In-Reply-To: <20230501140141.11743-4-avihaih@nvidia.com> (Avihai Horon's message of "Mon, 1 May 2023 17:01:36 +0300")
Avihai Horon <avihaih@nvidia.com> wrote:
> Add the core functionality of precopy initial data, which allows the
> destination to ACK that initial data has been loaded and the source to
> wait for this ACK before completing the migration.
>
> A new return path command MIG_RP_MSG_INITIAL_DATA_LOADED_ACK is added.
> It is sent by the destination after precopy initial data is loaded to
> ACK to the source that precopy initial data has been loaded.
>
> In addition, two new SaveVMHandlers handlers are added:
> 1. is_initial_data_active which indicates whether precopy initial data
> is used for this migration user (i.e., SaveStateEntry).
> 2. initial_data_loaded which indicates whether precopy initial data has
> been loaded by this migration user.
>
> Signed-off-by: Avihai Horon <avihaih@nvidia.com>
> @@ -1401,6 +1412,8 @@ void migrate_init(MigrationState *s)
> s->vm_was_running = false;
> s->iteration_initial_bytes = 0;
> s->threshold_size = 0;
> +
> + s->initial_data_loaded_acked = false;
In general, you let a blank line for the stuff you add, when all the
previous fields don't do that. Can you remove it.
> @@ -2704,6 +2725,20 @@ static void migration_update_counters(MigrationState *s,
> bandwidth, s->threshold_size);
> }
>
> +static bool initial_data_loaded_acked(MigrationState *s)
> +{
> + if (!migrate_precopy_initial_data()) {
> + return true;
> + }
> +
> + /* No reason to wait for precopy initial data loaded ACK if VM is stopped */
> + if (!runstate_is_running()) {
> + return true;
> + }
Thinking loud here.
What happens if we start a migration. Guest is running.
We enable precopy_initial_data().
And then we stop the guest.
Are we going to receive data that expect this return false? Or it is
handled somewhere else?
> @@ -2719,6 +2754,7 @@ static MigIterateState migration_iteration_run(MigrationState *s)
> {
> uint64_t must_precopy, can_postcopy;
> bool in_postcopy = s->state == MIGRATION_STATUS_POSTCOPY_ACTIVE;
> + bool initial_data_loaded = initial_data_loaded_acked(s);
>
> qemu_savevm_state_pending_estimate(&must_precopy, &can_postcopy);
> uint64_t pending_size = must_precopy + can_postcopy;
> @@ -2731,7 +2767,8 @@ static MigIterateState migration_iteration_run(MigrationState *s)
> trace_migrate_pending_exact(pending_size, must_precopy, can_postcopy);
> }
>
> - if (!pending_size || pending_size < s->threshold_size) {
> + if ((!pending_size || pending_size < s->threshold_size) &&
> + initial_data_loaded) {
> trace_migration_thread_low_pending(pending_size);
> migration_completion(s);
> return MIG_ITERATE_BREAK;
For this specific variable, I think I am going to add something more
general that this can piggy back.
For the migration tests I need exactly this functionality. I want
migration to run until the test decided that it is a good idea to
finish. I.e. For testing xbzrle I need at least three iterations, to
test auto_converge I need a minimum of 13 iterations. And I am going to
do exactly what you have done here.
Will came back to you after I think something.
> @@ -2739,7 +2776,7 @@ static MigIterateState migration_iteration_run(MigrationState *s)
>
> /* Still a significant amount to transfer */
> if (!in_postcopy && must_precopy <= s->threshold_size &&
> - qatomic_read(&s->start_postcopy)) {
> + initial_data_loaded && qatomic_read(&s->start_postcopy)) {
> if (postcopy_start(s)) {
> error_report("%s: postcopy failed to start", __func__);
> }
> diff --git a/migration/savevm.c b/migration/savevm.c
> index 2740defdf0..7a94deda3b 100644
> --- a/migration/savevm.c
> +++ b/migration/savevm.c
> @@ -2504,6 +2504,39 @@ static int loadvm_process_command(QEMUFile *f)
> return 0;
> }
>
> +static int qemu_loadvm_initial_data_loaded_ack(MigrationIncomingState *mis)
> +{
> + SaveStateEntry *se;
> + int ret;
> +
> + if (!mis->initial_data_enabled || mis->initial_data_loaded_ack_sent) {
> + return 0;
> + }
> +
> + QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> + if (!se->ops || !se->ops->initial_data_loaded) {
> + continue;
> + }
> +
> + if (!se->ops->is_initial_data_active ||
> + !se->ops->is_initial_data_active(se->opaque)) {
> + continue;
> + }
If you don't have any other use for is_initial_data_active() I think you
can integrate the functionality with initial_data_loaded().
If it is not active just return 1?
> +
> + if (!se->ops->initial_data_loaded(se->opaque)) {
> + return 0;
> + }
> + }
> +
> + ret = migrate_send_rp_initial_data_loaded_ack(mis);
> + if (!ret) {
> + mis->initial_data_loaded_ack_sent = true;
> + trace_loadvm_initial_data_loaded_acked();
> + }
> +
> + return ret;
> +}
Later, Juan
next prev parent reply other threads:[~2023-05-10 8:55 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-01 14:01 [PATCH 0/8] migration: Add precopy initial data capability and VFIO precopy support Avihai Horon
2023-05-01 14:01 ` [PATCH 1/8] migration: Add precopy initial data capability Avihai Horon
2023-05-10 8:24 ` Juan Quintela
2023-05-17 9:17 ` Markus Armbruster
2023-05-17 10:16 ` Avihai Horon
2023-05-17 12:21 ` Markus Armbruster
2023-05-17 13:23 ` Avihai Horon
2023-05-01 14:01 ` [PATCH 2/8] migration: Add precopy initial data handshake Avihai Horon
2023-05-02 22:54 ` Peter Xu
2023-05-03 15:31 ` Avihai Horon
2023-05-10 8:40 ` Juan Quintela
2023-05-10 15:32 ` Avihai Horon
2023-05-14 16:42 ` Cédric Le Goater
2023-05-15 7:56 ` Avihai Horon
2023-05-01 14:01 ` [PATCH 3/8] migration: Add precopy initial data loaded ACK functionality Avihai Horon
2023-05-02 22:56 ` Peter Xu
2023-05-03 15:36 ` Avihai Horon
2023-05-10 8:54 ` Juan Quintela [this message]
2023-05-10 15:52 ` Avihai Horon
2023-05-10 15:59 ` Juan Quintela
2023-05-01 14:01 ` [PATCH 4/8] migration: Enable precopy initial data capability Avihai Horon
2023-05-10 8:55 ` Juan Quintela
2023-05-01 14:01 ` [PATCH 5/8] tests: Add migration precopy initial data capability test Avihai Horon
2023-05-10 8:55 ` Juan Quintela
2023-05-01 14:01 ` [PATCH 6/8] vfio/migration: Refactor vfio_save_block() to return saved data size Avihai Horon
2023-05-10 9:00 ` Juan Quintela
2023-05-01 14:01 ` [PATCH 7/8] vfio/migration: Add VFIO migration pre-copy support Avihai Horon
2023-05-01 14:01 ` [PATCH 8/8] vfio/migration: Add support for precopy initial data capability Avihai Horon
2023-05-02 22:49 ` [PATCH 0/8] migration: Add precopy initial data capability and VFIO precopy support Peter Xu
2023-05-03 15:22 ` Avihai Horon
2023-05-03 15:49 ` Peter Xu
2023-05-04 10:18 ` Avihai Horon
2023-05-04 15:50 ` Peter Xu
2023-05-07 12:54 ` Avihai Horon
2023-05-08 0:49 ` Peter Xu
2023-05-08 11:11 ` Avihai Horon
2023-05-10 9:12 ` Juan Quintela
2023-05-10 16:01 ` Avihai Horon
2023-05-10 16:41 ` Juan Quintela
2023-05-11 11:31 ` Avihai Horon
2023-05-11 13:09 ` Juan Quintela
2023-05-11 15:08 ` Avihai Horon
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=87cz38a7n6.fsf@secure.mitica \
--to=quintela@redhat.com \
--cc=alex.williamson@redhat.com \
--cc=armbru@redhat.com \
--cc=avihaih@nvidia.com \
--cc=clg@redhat.com \
--cc=eblake@redhat.com \
--cc=jgg@nvidia.com \
--cc=joao.m.martins@oracle.com \
--cc=kwankhede@nvidia.com \
--cc=leobras@redhat.com \
--cc=lvivier@redhat.com \
--cc=maorg@nvidia.com \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=targupta@nvidia.com \
--cc=thuth@redhat.com \
--cc=yishaih@nvidia.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.