From: Prasad Pandit <ppandit@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Xu <peterx@redhat.com>, Fabiano Rosas <farosas@suse.de>,
Prasad Pandit <pjp@fedoraproject.org>
Subject: [PATCH 5/5] migration: enable multifd and postcopy together
Date: Tue, 29 Oct 2024 20:39:08 +0530 [thread overview]
Message-ID: <20241029150908.1136894-6-ppandit@redhat.com> (raw)
In-Reply-To: <20241029150908.1136894-1-ppandit@redhat.com>
From: Prasad Pandit <pjp@fedoraproject.org>
Enable Multifd and Postcopy migration together.
The migration_ioc_process_incoming() routine
checks magic value sent on each channel and
helps to properly setup multifd and postcopy
channels.
Idea is to take advantage of the multifd threads
to accelerate transfer of large guest RAM to the
destination and switch to postcopy mode sooner.
The Precopy and Multifd threads work during the
initial guest RAM transfer. When migration moves
to the Postcopy phase, the source guest is
paused, so the Precopy and Multifd threads stop
sending data on their channels. Postcopy threads
on the destination request/pull data from the
source side.
Signed-off-by: Prasad Pandit <pjp@fedoraproject.org>
---
migration/migration.c | 73 ++++++++++++++++++++++++++-----------------
1 file changed, 44 insertions(+), 29 deletions(-)
diff --git a/migration/migration.c b/migration/migration.c
index 021faee2f3..11fcc1e012 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -92,6 +92,9 @@ enum mig_rp_message_type {
MIG_RP_MSG_MAX
};
+/* Migration channel types */
+enum { CH_DEFAULT, CH_MULTIFD, CH_POSTCOPY };
+
/* When we add fault tolerance, we could have several
migrations at once. For now we don't need to add
dynamic creation of migration */
@@ -919,16 +922,15 @@ void migration_fd_process_incoming(QEMUFile *f)
* Returns true when we want to start a new incoming migration process,
* false otherwise.
*/
-static bool migration_should_start_incoming(bool main_channel)
+static bool migration_should_start_incoming(uint8_t channel)
{
+ if (channel == CH_POSTCOPY) {
+ return false;
+ }
+
/* Multifd doesn't start unless all channels are established */
if (migrate_multifd()) {
- return migration_has_all_channels();
- }
-
- /* Preempt channel only starts when the main channel is created */
- if (migrate_postcopy_preempt()) {
- return main_channel;
+ return multifd_recv_all_channels_created();
}
/*
@@ -936,7 +938,7 @@ static bool migration_should_start_incoming(bool main_channel)
* it's the main channel that's being created, and we should always
* proceed with this channel.
*/
- assert(main_channel);
+ assert(channel == CH_DEFAULT);
return true;
}
@@ -945,13 +947,11 @@ void migration_ioc_process_incoming(QIOChannel *ioc, Error **errp)
MigrationIncomingState *mis = migration_incoming_get_current();
Error *local_err = NULL;
QEMUFile *f;
- bool default_channel = true;
uint32_t channel_magic = 0;
+ uint8_t channel = CH_DEFAULT;
int ret = 0;
- if (migrate_multifd() && !migrate_mapped_ram() &&
- !migrate_postcopy_ram() &&
- qio_channel_has_feature(ioc, QIO_CHANNEL_FEATURE_READ_MSG_PEEK)) {
+ if (qio_channel_has_feature(ioc, QIO_CHANNEL_FEATURE_READ_MSG_PEEK)) {
/*
* With multiple channels, it is possible that we receive channels
* out of order on destination side, causing incorrect mapping of
@@ -969,35 +969,49 @@ void migration_ioc_process_incoming(QIOChannel *ioc, Error **errp)
return;
}
- default_channel = (channel_magic == cpu_to_be32(QEMU_VM_FILE_MAGIC));
- } else {
- default_channel = !mis->from_src_file;
+ if (channel_magic == cpu_to_be32(QEMU_VM_FILE_MAGIC)) {
+ channel = CH_DEFAULT;
+ } else if (channel_magic == cpu_to_be32(MULTIFD_MAGIC)) {
+ channel = CH_MULTIFD;
+ } else if (channel_magic == cpu_to_be32(POSTCOPY_MAGIC)) {
+ if (qio_channel_read_all(ioc, (char *)&channel_magic,
+ sizeof(channel_magic), &local_err)) {
+ error_report_err(local_err);
+ return;
+ }
+ channel = CH_POSTCOPY;
+ } else {
+ error_report("%s: could not identify channel, unknown magic: %u",
+ __func__, channel_magic);
+ return;
+ }
}
if (multifd_recv_setup(errp) != 0) {
return;
}
- if (default_channel) {
+ if (channel == CH_DEFAULT) {
f = qemu_file_new_input(ioc);
migration_incoming_setup(f);
- } else {
+ } else if (channel == CH_MULTIFD) {
/* Multiple connections */
- assert(migration_needs_multiple_sockets());
if (migrate_multifd()) {
multifd_recv_new_channel(ioc, &local_err);
- } else {
+ }
+ if (local_err) {
+ error_propagate(errp, local_err);
+ return;
+ }
+ } else if (channel == CH_POSTCOPY) {
+ if (migrate_postcopy()) {
assert(migrate_postcopy_preempt());
f = qemu_file_new_input(ioc);
postcopy_preempt_new_channel(mis, f);
}
- if (local_err) {
- error_propagate(errp, local_err);
- return;
- }
}
- if (migration_should_start_incoming(default_channel)) {
+ if (migration_should_start_incoming(channel)) {
/* If it's a recovery, we're done */
if (postcopy_try_recover()) {
return;
@@ -1014,21 +1028,22 @@ void migration_ioc_process_incoming(QIOChannel *ioc, Error **errp)
*/
bool migration_has_all_channels(void)
{
+ bool ret = false;
MigrationIncomingState *mis = migration_incoming_get_current();
if (!mis->from_src_file) {
- return false;
+ return ret;
}
if (migrate_multifd()) {
- return multifd_recv_all_channels_created();
+ ret = multifd_recv_all_channels_created();
}
- if (migrate_postcopy_preempt()) {
- return mis->postcopy_qemufile_dst != NULL;
+ if (ret && migrate_postcopy_preempt()) {
+ ret = mis->postcopy_qemufile_dst != NULL;
}
- return true;
+ return ret;
}
int migrate_send_rp_switchover_ack(MigrationIncomingState *mis)
--
2.47.0
next prev parent reply other threads:[~2024-10-29 15:11 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-29 15:09 [PATCH 0/5] Allow to enable multifd and postcopy migration together Prasad Pandit
2024-10-29 15:09 ` [PATCH 1/5] migration/multifd: move macros to multifd header Prasad Pandit
2024-10-29 15:09 ` [PATCH 2/5] migration/postcopy: magic value for postcopy channel Prasad Pandit
[not found] ` <ZyTnBwpOwXcHGGPJ@x1n>
2024-11-04 12:32 ` Prasad Pandit
2024-11-04 17:18 ` Peter Xu
2024-11-05 11:19 ` Prasad Pandit
2024-11-05 13:00 ` Peter Xu
2024-11-06 12:19 ` Prasad Pandit
2024-11-06 13:11 ` Fabiano Rosas
2024-11-07 12:05 ` Prasad Pandit
2024-11-07 12:11 ` Fabiano Rosas
2024-11-07 12:33 ` Daniel P. Berrangé
2024-11-07 16:17 ` Peter Xu
2024-11-07 16:57 ` Daniel P. Berrangé
2024-11-07 17:45 ` Peter Xu
2024-11-08 12:37 ` Prasad Pandit
2024-11-08 13:25 ` Fabiano Rosas
2024-11-06 16:00 ` Peter Xu
2024-11-07 11:52 ` Prasad Pandit
2024-11-07 15:56 ` Peter Xu
2024-10-29 15:09 ` [PATCH 3/5] migration: remove multifd check with postcopy Prasad Pandit
[not found] ` <ZyTnWYyHlrJUYQRB@x1n>
2024-11-04 12:23 ` Prasad Pandit
2024-11-04 16:52 ` Peter Xu
2024-11-05 9:50 ` Prasad Pandit
2024-10-29 15:09 ` [PATCH 4/5] migration: refactor ram_save_target_page functions Prasad Pandit
[not found] ` <ZyToBbvfWkIZ_40W@x1n>
2024-11-04 11:56 ` Prasad Pandit
2024-11-04 17:00 ` Peter Xu
2024-11-05 10:01 ` Prasad Pandit
2024-11-05 13:01 ` Peter Xu
2024-10-29 15:09 ` Prasad Pandit [this message]
2024-11-04 17:48 ` [PATCH 5/5] migration: enable multifd and postcopy together Peter Xu
2024-11-05 11:54 ` Prasad Pandit
2024-11-05 16:55 ` Peter Xu
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=20241029150908.1136894-6-ppandit@redhat.com \
--to=ppandit@redhat.com \
--cc=farosas@suse.de \
--cc=peterx@redhat.com \
--cc=pjp@fedoraproject.org \
--cc=qemu-devel@nongnu.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).