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

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