|
|
0727d3 |
From fce933410a5068220a5f29011a6d1a647e357a62 Mon Sep 17 00:00:00 2001
|
|
|
0727d3 |
From: Leonardo Bras <leobras@redhat.com>
|
|
|
0727d3 |
Date: Wed, 18 May 2022 02:52:25 -0300
|
|
|
0727d3 |
Subject: [PATCH 21/37] multifd: multifd_send_sync_main now returns negative on
|
|
|
0727d3 |
error
|
|
|
0727d3 |
MIME-Version: 1.0
|
|
|
0727d3 |
Content-Type: text/plain; charset=UTF-8
|
|
|
0727d3 |
Content-Transfer-Encoding: 8bit
|
|
|
0727d3 |
|
|
|
0727d3 |
RH-Author: Leonardo Brás <leobras@redhat.com>
|
|
|
0727d3 |
RH-MergeRequest: 191: MSG_ZEROCOPY + Multifd @ rhel8.7
|
|
|
0727d3 |
RH-Commit: [21/26] b4e4f3663576aa87f3b2f66f1d38bad4f50bd4ac
|
|
|
0727d3 |
RH-Bugzilla: 2072049
|
|
|
0727d3 |
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
|
|
0727d3 |
RH-Acked-by: Daniel P. Berrangé <berrange@redhat.com>
|
|
|
0727d3 |
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
|
|
0727d3 |
|
|
|
0727d3 |
Even though multifd_send_sync_main() currently emits error_reports, it's
|
|
|
0727d3 |
callers don't really check it before continuing.
|
|
|
0727d3 |
|
|
|
0727d3 |
Change multifd_send_sync_main() to return -1 on error and 0 on success.
|
|
|
0727d3 |
Also change all it's callers to make use of this change and possibly fail
|
|
|
0727d3 |
earlier.
|
|
|
0727d3 |
|
|
|
0727d3 |
(This change is important to next patch on multifd zero copy
|
|
|
0727d3 |
implementation, to make it sure an error in zero-copy flush does not go
|
|
|
0727d3 |
unnoticed.
|
|
|
0727d3 |
|
|
|
0727d3 |
Signed-off-by: Leonardo Bras <leobras@redhat.com>
|
|
|
0727d3 |
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
|
|
0727d3 |
Reviewed-by: Peter Xu <peterx@redhat.com>
|
|
|
0727d3 |
Message-Id: <20220513062836.965425-7-leobras@redhat.com>
|
|
|
0727d3 |
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
|
|
0727d3 |
(cherry picked from commit 33d70973a3a6e8c6b62bcbc64d9e488961981007)
|
|
|
0727d3 |
Signed-off-by: Leonardo Bras <leobras@redhat.com>
|
|
|
0727d3 |
---
|
|
|
0727d3 |
migration/multifd.c | 10 ++++++----
|
|
|
0727d3 |
migration/multifd.h | 2 +-
|
|
|
0727d3 |
migration/ram.c | 29 ++++++++++++++++++++++-------
|
|
|
0727d3 |
3 files changed, 29 insertions(+), 12 deletions(-)
|
|
|
0727d3 |
|
|
|
0727d3 |
diff --git a/migration/multifd.c b/migration/multifd.c
|
|
|
0727d3 |
index e53811f04a..1e34e01ebc 100644
|
|
|
0727d3 |
--- a/migration/multifd.c
|
|
|
0727d3 |
+++ b/migration/multifd.c
|
|
|
0727d3 |
@@ -573,17 +573,17 @@ void multifd_save_cleanup(void)
|
|
|
0727d3 |
multifd_send_state = NULL;
|
|
|
0727d3 |
}
|
|
|
0727d3 |
|
|
|
0727d3 |
-void multifd_send_sync_main(QEMUFile *f)
|
|
|
0727d3 |
+int multifd_send_sync_main(QEMUFile *f)
|
|
|
0727d3 |
{
|
|
|
0727d3 |
int i;
|
|
|
0727d3 |
|
|
|
0727d3 |
if (!migrate_use_multifd()) {
|
|
|
0727d3 |
- return;
|
|
|
0727d3 |
+ return 0;
|
|
|
0727d3 |
}
|
|
|
0727d3 |
if (multifd_send_state->pages->num) {
|
|
|
0727d3 |
if (multifd_send_pages(f) < 0) {
|
|
|
0727d3 |
error_report("%s: multifd_send_pages fail", __func__);
|
|
|
0727d3 |
- return;
|
|
|
0727d3 |
+ return -1;
|
|
|
0727d3 |
}
|
|
|
0727d3 |
}
|
|
|
0727d3 |
for (i = 0; i < migrate_multifd_channels(); i++) {
|
|
|
0727d3 |
@@ -596,7 +596,7 @@ void multifd_send_sync_main(QEMUFile *f)
|
|
|
0727d3 |
if (p->quit) {
|
|
|
0727d3 |
error_report("%s: channel %d has already quit", __func__, i);
|
|
|
0727d3 |
qemu_mutex_unlock(&p->mutex);
|
|
|
0727d3 |
- return;
|
|
|
0727d3 |
+ return -1;
|
|
|
0727d3 |
}
|
|
|
0727d3 |
|
|
|
0727d3 |
p->packet_num = multifd_send_state->packet_num++;
|
|
|
0727d3 |
@@ -615,6 +615,8 @@ void multifd_send_sync_main(QEMUFile *f)
|
|
|
0727d3 |
qemu_sem_wait(&p->sem_sync);
|
|
|
0727d3 |
}
|
|
|
0727d3 |
trace_multifd_send_sync_main(multifd_send_state->packet_num);
|
|
|
0727d3 |
+
|
|
|
0727d3 |
+ return 0;
|
|
|
0727d3 |
}
|
|
|
0727d3 |
|
|
|
0727d3 |
static void *multifd_send_thread(void *opaque)
|
|
|
0727d3 |
diff --git a/migration/multifd.h b/migration/multifd.h
|
|
|
0727d3 |
index 7823199dbe..92de878155 100644
|
|
|
0727d3 |
--- a/migration/multifd.h
|
|
|
0727d3 |
+++ b/migration/multifd.h
|
|
|
0727d3 |
@@ -22,7 +22,7 @@ int multifd_load_cleanup(Error **errp);
|
|
|
0727d3 |
bool multifd_recv_all_channels_created(void);
|
|
|
0727d3 |
bool multifd_recv_new_channel(QIOChannel *ioc, Error **errp);
|
|
|
0727d3 |
void multifd_recv_sync_main(void);
|
|
|
0727d3 |
-void multifd_send_sync_main(QEMUFile *f);
|
|
|
0727d3 |
+int multifd_send_sync_main(QEMUFile *f);
|
|
|
0727d3 |
int multifd_queue_page(QEMUFile *f, RAMBlock *block, ram_addr_t offset);
|
|
|
0727d3 |
|
|
|
0727d3 |
/* Multifd Compression flags */
|
|
|
0727d3 |
diff --git a/migration/ram.c b/migration/ram.c
|
|
|
0727d3 |
index 863035d235..3e208efca7 100644
|
|
|
0727d3 |
--- a/migration/ram.c
|
|
|
0727d3 |
+++ b/migration/ram.c
|
|
|
0727d3 |
@@ -2992,6 +2992,7 @@ static int ram_save_setup(QEMUFile *f, void *opaque)
|
|
|
0727d3 |
{
|
|
|
0727d3 |
RAMState **rsp = opaque;
|
|
|
0727d3 |
RAMBlock *block;
|
|
|
0727d3 |
+ int ret;
|
|
|
0727d3 |
|
|
|
0727d3 |
if (compress_threads_save_setup()) {
|
|
|
0727d3 |
return -1;
|
|
|
0727d3 |
@@ -3026,7 +3027,11 @@ static int ram_save_setup(QEMUFile *f, void *opaque)
|
|
|
0727d3 |
ram_control_before_iterate(f, RAM_CONTROL_SETUP);
|
|
|
0727d3 |
ram_control_after_iterate(f, RAM_CONTROL_SETUP);
|
|
|
0727d3 |
|
|
|
0727d3 |
- multifd_send_sync_main(f);
|
|
|
0727d3 |
+ ret = multifd_send_sync_main(f);
|
|
|
0727d3 |
+ if (ret < 0) {
|
|
|
0727d3 |
+ return ret;
|
|
|
0727d3 |
+ }
|
|
|
0727d3 |
+
|
|
|
0727d3 |
qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
|
|
|
0727d3 |
qemu_fflush(f);
|
|
|
0727d3 |
|
|
|
0727d3 |
@@ -3135,7 +3140,11 @@ static int ram_save_iterate(QEMUFile *f, void *opaque)
|
|
|
0727d3 |
out:
|
|
|
0727d3 |
if (ret >= 0
|
|
|
0727d3 |
&& migration_is_setup_or_active(migrate_get_current()->state)) {
|
|
|
0727d3 |
- multifd_send_sync_main(rs->f);
|
|
|
0727d3 |
+ ret = multifd_send_sync_main(rs->f);
|
|
|
0727d3 |
+ if (ret < 0) {
|
|
|
0727d3 |
+ return ret;
|
|
|
0727d3 |
+ }
|
|
|
0727d3 |
+
|
|
|
0727d3 |
qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
|
|
|
0727d3 |
qemu_fflush(f);
|
|
|
0727d3 |
ram_counters.transferred += 8;
|
|
|
0727d3 |
@@ -3193,13 +3202,19 @@ static int ram_save_complete(QEMUFile *f, void *opaque)
|
|
|
0727d3 |
ram_control_after_iterate(f, RAM_CONTROL_FINISH);
|
|
|
0727d3 |
}
|
|
|
0727d3 |
|
|
|
0727d3 |
- if (ret >= 0) {
|
|
|
0727d3 |
- multifd_send_sync_main(rs->f);
|
|
|
0727d3 |
- qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
|
|
|
0727d3 |
- qemu_fflush(f);
|
|
|
0727d3 |
+ if (ret < 0) {
|
|
|
0727d3 |
+ return ret;
|
|
|
0727d3 |
}
|
|
|
0727d3 |
|
|
|
0727d3 |
- return ret;
|
|
|
0727d3 |
+ ret = multifd_send_sync_main(rs->f);
|
|
|
0727d3 |
+ if (ret < 0) {
|
|
|
0727d3 |
+ return ret;
|
|
|
0727d3 |
+ }
|
|
|
0727d3 |
+
|
|
|
0727d3 |
+ qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
|
|
|
0727d3 |
+ qemu_fflush(f);
|
|
|
0727d3 |
+
|
|
|
0727d3 |
+ return 0;
|
|
|
0727d3 |
}
|
|
|
0727d3 |
|
|
|
0727d3 |
static void ram_save_pending(QEMUFile *f, void *opaque, uint64_t max_size,
|
|
|
0727d3 |
--
|
|
|
0727d3 |
2.35.3
|
|
|
0727d3 |
|