Blame SOURCES/kvm-multifd-multifd_send_sync_main-now-returns-negative-.patch

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