164 lines
5.1 KiB
Diff
164 lines
5.1 KiB
Diff
|
From 4ca5375a936bc87829c6e2b4620f56c73a5efc70 Mon Sep 17 00:00:00 2001
|
||
|
From: Leonardo Bras <leobras@redhat.com>
|
||
|
Date: Fri, 13 May 2022 03:28:35 -0300
|
||
|
Subject: [PATCH 12/18] multifd: multifd_send_sync_main now returns negative on
|
||
|
error
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
RH-Author: Leonardo Brás <leobras@redhat.com>
|
||
|
RH-MergeRequest: 95: MSG_ZEROCOPY + Multifd
|
||
|
RH-Commit: [6/11] c8ebdee4327d463c74f4b2eeb42d3c964f314c94 (LeoBras/centos-qemu-kvm)
|
||
|
RH-Bugzilla: 1968509
|
||
|
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||
|
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||
|
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||
|
|
||
|
Even though multifd_send_sync_main() currently emits error_reports, it's
|
||
|
callers don't really check it before continuing.
|
||
|
|
||
|
Change multifd_send_sync_main() to return -1 on error and 0 on success.
|
||
|
Also change all it's callers to make use of this change and possibly fail
|
||
|
earlier.
|
||
|
|
||
|
(This change is important to next patch on multifd zero copy
|
||
|
implementation, to make it sure an error in zero-copy flush does not go
|
||
|
unnoticed.
|
||
|
|
||
|
Signed-off-by: Leonardo Bras <leobras@redhat.com>
|
||
|
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||
|
Reviewed-by: Peter Xu <peterx@redhat.com>
|
||
|
Message-Id: <20220513062836.965425-7-leobras@redhat.com>
|
||
|
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||
|
(cherry picked from commit 33d70973a3a6e8c6b62bcbc64d9e488961981007)
|
||
|
Signed-off-by: Leonardo Bras <leobras@redhat.com>
|
||
|
---
|
||
|
migration/multifd.c | 10 ++++++----
|
||
|
migration/multifd.h | 2 +-
|
||
|
migration/ram.c | 29 ++++++++++++++++++++++-------
|
||
|
3 files changed, 29 insertions(+), 12 deletions(-)
|
||
|
|
||
|
diff --git a/migration/multifd.c b/migration/multifd.c
|
||
|
index 43998ad117..cdb57439a7 100644
|
||
|
--- a/migration/multifd.c
|
||
|
+++ b/migration/multifd.c
|
||
|
@@ -568,17 +568,17 @@ void multifd_save_cleanup(void)
|
||
|
multifd_send_state = NULL;
|
||
|
}
|
||
|
|
||
|
-void multifd_send_sync_main(QEMUFile *f)
|
||
|
+int multifd_send_sync_main(QEMUFile *f)
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
if (!migrate_use_multifd()) {
|
||
|
- return;
|
||
|
+ return 0;
|
||
|
}
|
||
|
if (multifd_send_state->pages->num) {
|
||
|
if (multifd_send_pages(f) < 0) {
|
||
|
error_report("%s: multifd_send_pages fail", __func__);
|
||
|
- return;
|
||
|
+ return -1;
|
||
|
}
|
||
|
}
|
||
|
for (i = 0; i < migrate_multifd_channels(); i++) {
|
||
|
@@ -591,7 +591,7 @@ void multifd_send_sync_main(QEMUFile *f)
|
||
|
if (p->quit) {
|
||
|
error_report("%s: channel %d has already quit", __func__, i);
|
||
|
qemu_mutex_unlock(&p->mutex);
|
||
|
- return;
|
||
|
+ return -1;
|
||
|
}
|
||
|
|
||
|
p->packet_num = multifd_send_state->packet_num++;
|
||
|
@@ -610,6 +610,8 @@ void multifd_send_sync_main(QEMUFile *f)
|
||
|
qemu_sem_wait(&p->sem_sync);
|
||
|
}
|
||
|
trace_multifd_send_sync_main(multifd_send_state->packet_num);
|
||
|
+
|
||
|
+ return 0;
|
||
|
}
|
||
|
|
||
|
static void *multifd_send_thread(void *opaque)
|
||
|
diff --git a/migration/multifd.h b/migration/multifd.h
|
||
|
index 4dda900a0b..cd495195ce 100644
|
||
|
--- a/migration/multifd.h
|
||
|
+++ b/migration/multifd.h
|
||
|
@@ -22,7 +22,7 @@ int multifd_load_cleanup(Error **errp);
|
||
|
bool multifd_recv_all_channels_created(void);
|
||
|
bool multifd_recv_new_channel(QIOChannel *ioc, Error **errp);
|
||
|
void multifd_recv_sync_main(void);
|
||
|
-void multifd_send_sync_main(QEMUFile *f);
|
||
|
+int multifd_send_sync_main(QEMUFile *f);
|
||
|
int multifd_queue_page(QEMUFile *f, RAMBlock *block, ram_addr_t offset);
|
||
|
|
||
|
/* Multifd Compression flags */
|
||
|
diff --git a/migration/ram.c b/migration/ram.c
|
||
|
index 0ef4bd63eb..fb6db54642 100644
|
||
|
--- a/migration/ram.c
|
||
|
+++ b/migration/ram.c
|
||
|
@@ -2903,6 +2903,7 @@ static int ram_save_setup(QEMUFile *f, void *opaque)
|
||
|
{
|
||
|
RAMState **rsp = opaque;
|
||
|
RAMBlock *block;
|
||
|
+ int ret;
|
||
|
|
||
|
if (compress_threads_save_setup()) {
|
||
|
return -1;
|
||
|
@@ -2937,7 +2938,11 @@ static int ram_save_setup(QEMUFile *f, void *opaque)
|
||
|
ram_control_before_iterate(f, RAM_CONTROL_SETUP);
|
||
|
ram_control_after_iterate(f, RAM_CONTROL_SETUP);
|
||
|
|
||
|
- multifd_send_sync_main(f);
|
||
|
+ ret = multifd_send_sync_main(f);
|
||
|
+ if (ret < 0) {
|
||
|
+ return ret;
|
||
|
+ }
|
||
|
+
|
||
|
qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
|
||
|
qemu_fflush(f);
|
||
|
|
||
|
@@ -3046,7 +3051,11 @@ static int ram_save_iterate(QEMUFile *f, void *opaque)
|
||
|
out:
|
||
|
if (ret >= 0
|
||
|
&& migration_is_setup_or_active(migrate_get_current()->state)) {
|
||
|
- multifd_send_sync_main(rs->f);
|
||
|
+ ret = multifd_send_sync_main(rs->f);
|
||
|
+ if (ret < 0) {
|
||
|
+ return ret;
|
||
|
+ }
|
||
|
+
|
||
|
qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
|
||
|
qemu_fflush(f);
|
||
|
ram_transferred_add(8);
|
||
|
@@ -3106,13 +3115,19 @@ static int ram_save_complete(QEMUFile *f, void *opaque)
|
||
|
ram_control_after_iterate(f, RAM_CONTROL_FINISH);
|
||
|
}
|
||
|
|
||
|
- if (ret >= 0) {
|
||
|
- multifd_send_sync_main(rs->f);
|
||
|
- qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
|
||
|
- qemu_fflush(f);
|
||
|
+ if (ret < 0) {
|
||
|
+ return ret;
|
||
|
}
|
||
|
|
||
|
- return ret;
|
||
|
+ ret = multifd_send_sync_main(rs->f);
|
||
|
+ if (ret < 0) {
|
||
|
+ return ret;
|
||
|
+ }
|
||
|
+
|
||
|
+ qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
|
||
|
+ qemu_fflush(f);
|
||
|
+
|
||
|
+ return 0;
|
||
|
}
|
||
|
|
||
|
static void ram_save_pending(QEMUFile *f, void *opaque, uint64_t max_size,
|
||
|
--
|
||
|
2.35.3
|
||
|
|