From: Prasad Pandit
Refactor ram_save_target_page legacy and multifd
functions into one. Other than simplifying it,
it frees 'migration_ops' object from usage, so it
is expunged.
Reviewed-by: Fabiano Rosas
Signed-off-by: Prasad Pandit
---
migration/ram.c | 67 +
1 file changed, 17 insertions(+), 50 deletions(-)
v4: no change
-
https://lore.kernel.org/qemu-devel/[email protected]/T/#t
diff --git a/migration/ram.c b/migration/ram.c
index ce28328141..f2326788de 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -446,13 +446,6 @@ void ram_transferred_add(uint64_t bytes)
}
}
-struct MigrationOps {
-int (*ram_save_target_page)(RAMState *rs, PageSearchStatus *pss);
-};
-typedef struct MigrationOps MigrationOps;
-
-MigrationOps *migration_ops;
-
static int ram_save_host_page_urgent(PageSearchStatus *pss);
/* NOTE: page is the PFN not real ram_addr_t. */
@@ -1958,55 +1951,36 @@ int ram_save_queue_pages(const char *rbname, ram_addr_t
start, ram_addr_t len,
}
/**
- * ram_save_target_page_legacy: save one target page
- *
- * Returns the number of pages written
+ * ram_save_target_page: save one target page to the precopy thread
+ * OR to multifd workers.
*
* @rs: current RAM state
* @pss: data about the page we want to send
*/
-static int ram_save_target_page_legacy(RAMState *rs, PageSearchStatus *pss)
+static int ram_save_target_page(RAMState *rs, PageSearchStatus *pss)
{
ram_addr_t offset = ((ram_addr_t)pss->page) << TARGET_PAGE_BITS;
int res;
+if (!migrate_multifd()
+|| migrate_zero_page_detection() == ZERO_PAGE_DETECTION_LEGACY) {
+if (save_zero_page(rs, pss, offset)) {
+return 1;
+}
+}
+
+if (migrate_multifd()) {
+RAMBlock *block = pss->block;
+return ram_save_multifd_page(block, offset);
+}
+
if (control_save_page(pss, offset, &res)) {
return res;
}
-if (save_zero_page(rs, pss, offset)) {
-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;
-
-/*
- * While using multifd live migration, we still need to handle zero
- * page checking on the migration main thread.
- */
-if (migrate_zero_page_detection() == ZERO_PAGE_DETECTION_LEGACY) {
-if (save_zero_page(rs, pss, offset)) {
-return 1;
-}
-}
-
-return ram_save_multifd_page(block, offset);
-}
-
/* Should be called before sending a host page */
static void pss_host_page_prepare(PageSearchStatus *pss)
{
@@ -2093,7 +2067,7 @@ static int ram_save_host_page_urgent(PageSearchStatus
*pss)
if (page_dirty) {
/* Be strict to return code; it must be 1, or what else? */
-if (migration_ops->ram_save_target_page(rs, pss) != 1) {
+if (ram_save_target_page(rs, pss) != 1) {
error_report_once("%s: ram_save_target_page failed", __func__);
ret = -1;
goto out;
@@ -2162,7 +2136,7 @@ static int ram_save_host_page(RAMState *rs,
PageSearchStatus *pss)
if (preempt_active) {
qemu_mutex_unlock(&rs->bitmap_mutex);
}
-tmppages = migration_ops->ram_save_target_page(rs, pss);
+tmppages = ram_save_target_page(rs, pss);
if (tmppages >= 0) {
pages += tmppages;
/*
@@ -2360,8 +2334,6 @@ static void ram_save_cleanup(void *opaque)
xbzrle_cleanup();
multifd_ram_save_cleanup();
ram_state_cleanup(rsp);
-g_free(migration_ops);
-migration_ops = NULL;
}
static void ram_state_reset(RAMState *rs)
@@ -3027,13 +2999,8 @@ static int ram_save_setup(QEMUFile *f, void *opaque,
Error **errp)
return ret;
}
-migration_ops = g_malloc0(sizeof(MigrationOps));
-
if (migrate_multifd()) {
multifd_ram_save_setup();
-migration_ops->ram_save_target_page = ram_save_target_page_multifd;
-} else {
-migration_ops->ram_save_target_page = ram_save_target_page_legacy;
}
/*
--
2.48.1