migration/multifd: Implement ram_save_target_page_multifd to handle multifd version of MigrationOps::ram_save_target_page.
1. Add a dedicated handler for MigrationOps::ram_save_target_page in multifd live migration. 2. Refactor ram_save_target_page_legacy so that the legacy and multifd handlers don't have internal functions calling into each other. Signed-off-by: Hao Xiang <hao.xiang@bytedance.com> Reviewed-by: Fabiano Rosas <farosas@suse.de> Message-Id: <20240226195654.934709-4-hao.xiang@bytedance.com> Link: https://lore.kernel.org/r/20240311180015.3359271-6-hao.xiang@linux.dev Signed-off-by: Peter Xu <peterx@redhat.com>
This commit is contained in:
parent
303e6f54f9
commit
9ae90f73e6
@ -2079,7 +2079,6 @@ static bool save_compress_page(RAMState *rs, PageSearchStatus *pss,
|
|||||||
*/
|
*/
|
||||||
static int ram_save_target_page_legacy(RAMState *rs, PageSearchStatus *pss)
|
static int ram_save_target_page_legacy(RAMState *rs, PageSearchStatus *pss)
|
||||||
{
|
{
|
||||||
RAMBlock *block = pss->block;
|
|
||||||
ram_addr_t offset = ((ram_addr_t)pss->page) << TARGET_PAGE_BITS;
|
ram_addr_t offset = ((ram_addr_t)pss->page) << TARGET_PAGE_BITS;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
@ -2095,17 +2094,33 @@ static int ram_save_target_page_legacy(RAMState *rs, PageSearchStatus *pss)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return ram_save_page(rs, pss);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ram_save_target_page_multifd: send one target page to multifd workers
|
||||||
|
*
|
||||||
|
* Returns 1 if the page was queued, -1 otherwise.
|
||||||
|
*
|
||||||
|
* @rs: current RAM state
|
||||||
|
* @pss: data about the page we want to send
|
||||||
|
*/
|
||||||
|
static int ram_save_target_page_multifd(RAMState *rs, PageSearchStatus *pss)
|
||||||
|
{
|
||||||
|
RAMBlock *block = pss->block;
|
||||||
|
ram_addr_t offset = ((ram_addr_t)pss->page) << TARGET_PAGE_BITS;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Do not use multifd in postcopy as one whole host page should be
|
* While using multifd live migration, we still need to handle zero
|
||||||
* placed. Meanwhile postcopy requires atomic update of pages, so even
|
* page checking on the migration main thread.
|
||||||
* if host page size == guest page size the dest guest during run may
|
|
||||||
* still see partially copied pages which is data corruption.
|
|
||||||
*/
|
*/
|
||||||
if (migrate_multifd() && !migration_in_postcopy()) {
|
if (migrate_zero_page_detection() == ZERO_PAGE_DETECTION_LEGACY) {
|
||||||
return ram_save_multifd_page(block, offset);
|
if (save_zero_page(rs, pss, offset)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ram_save_page(rs, pss);
|
return ram_save_multifd_page(block, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Should be called before sending a host page */
|
/* Should be called before sending a host page */
|
||||||
@ -3112,7 +3127,12 @@ static int ram_save_setup(QEMUFile *f, void *opaque)
|
|||||||
}
|
}
|
||||||
|
|
||||||
migration_ops = g_malloc0(sizeof(MigrationOps));
|
migration_ops = g_malloc0(sizeof(MigrationOps));
|
||||||
migration_ops->ram_save_target_page = ram_save_target_page_legacy;
|
|
||||||
|
if (migrate_multifd()) {
|
||||||
|
migration_ops->ram_save_target_page = ram_save_target_page_multifd;
|
||||||
|
} else {
|
||||||
|
migration_ops->ram_save_target_page = ram_save_target_page_legacy;
|
||||||
|
}
|
||||||
|
|
||||||
bql_unlock();
|
bql_unlock();
|
||||||
ret = multifd_send_sync_main();
|
ret = multifd_send_sync_main();
|
||||||
|
Loading…
Reference in New Issue
Block a user