migration: enable multifd and postcopy together

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.

The Precopy and Multifd threads work during the initial
guest RAM transfer. When migration moves to the Postcopy
phase, the multifd threads cease to send data on multifd
channels and Postcopy threads on the destination
request/pull data from the source side.

Reviewed-by: Fabiano Rosas <farosas@suse.de>
Signed-off-by: Prasad Pandit <pjp@fedoraproject.org>
Link: https://lore.kernel.org/r/20250512125124.147064-3-ppandit@redhat.com
Signed-off-by: Peter Xu <peterx@redhat.com>
This commit is contained in:
Prasad Pandit 2025-05-12 18:21:23 +05:30 committed by Peter Xu
parent 249543d0c0
commit e274188612
4 changed files with 11 additions and 9 deletions

View file

@ -17,6 +17,7 @@
#include "migration-stats.h"
#include "multifd.h"
#include "options.h"
#include "migration.h"
#include "qapi/error.h"
#include "qemu/cutils.h"
#include "qemu/error-report.h"
@ -398,7 +399,7 @@ int multifd_ram_flush_and_sync(QEMUFile *f)
MultiFDSyncReq req;
int ret;
if (!migrate_multifd()) {
if (!migrate_multifd() || migration_in_postcopy()) {
return 0;
}

View file

@ -1379,6 +1379,13 @@ static void *multifd_recv_thread(void *opaque)
}
if (has_data) {
/*
* multifd thread should not be active and receive data
* when migration is in the Postcopy phase. Two threads
* writing the same memory area could easily corrupt
* the guest state.
*/
assert(!migration_in_postcopy());
if (is_device_state) {
assert(use_packets);
ret = multifd_device_state_recv(p, &local_err);

View file

@ -509,11 +509,6 @@ bool migrate_caps_check(bool *old_caps, bool *new_caps, Error **errp)
error_setg(errp, "Postcopy is not compatible with ignore-shared");
return false;
}
if (new_caps[MIGRATION_CAPABILITY_MULTIFD]) {
error_setg(errp, "Postcopy is not yet compatible with multifd");
return false;
}
}
if (new_caps[MIGRATION_CAPABILITY_BACKGROUND_SNAPSHOT]) {

View file

@ -1993,9 +1993,8 @@ static int ram_save_target_page(RAMState *rs, PageSearchStatus *pss)
}
}
if (migrate_multifd()) {
RAMBlock *block = pss->block;
return ram_save_multifd_page(block, offset);
if (migrate_multifd() && !migration_in_postcopy()) {
return ram_save_multifd_page(pss->block, offset);
}
return ram_save_page(rs, pss);