qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Steve Sistare <steven.sistare@oracle.com>
To: qemu-devel@nongnu.org
Cc: Peter Xu <peterx@redhat.com>, Fabiano Rosas <farosas@suse.de>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	Jason Wang <jasowang@redhat.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Cedric Le Goater <clg@redhat.com>,
	Gerd Hoffmann <kraxel@redhat.com>,
	Marc-Andre Lureau <marcandre.lureau@redhat.com>,
	David Hildenbrand <david@redhat.com>,
	Steve Sistare <steven.sistare@oracle.com>
Subject: [PATCH V3 09/13] migration: notifier error checking
Date: Thu,  8 Feb 2024 10:54:02 -0800	[thread overview]
Message-ID: <1707418446-134863-10-git-send-email-steven.sistare@oracle.com> (raw)
In-Reply-To: <1707418446-134863-1-git-send-email-steven.sistare@oracle.com>

Check the status returned by migration notifiers and report errors.
If notifiers fail, call the notifiers again so they can clean up.
None of the notifiers return an error status at this time.

Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
---
 include/migration/misc.h |  3 ++-
 migration/migration.c    | 40 +++++++++++++++++++++++++++++-----------
 2 files changed, 31 insertions(+), 12 deletions(-)

diff --git a/include/migration/misc.h b/include/migration/misc.h
index 0ea1902..6dc234b 100644
--- a/include/migration/misc.h
+++ b/include/migration/misc.h
@@ -82,7 +82,8 @@ void migration_add_notifier(NotifierWithReturn *notify,
 void migration_add_notifier_mode(NotifierWithReturn *notify,
                                  MigrationNotifyFunc func, MigMode mode);
 void migration_remove_notifier(NotifierWithReturn *notify);
-void migration_call_notifiers(MigrationState *s, MigrationEventType type);
+int migration_call_notifiers(MigrationState *s, MigrationEventType type,
+                             Error **errp);
 bool migration_in_setup(MigrationState *);
 bool migration_has_finished(MigrationState *);
 bool migration_has_failed(MigrationState *);
diff --git a/migration/migration.c b/migration/migration.c
index 01d8867..d1fce9e 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1318,6 +1318,8 @@ void migrate_set_state(int *state, int old_state, int new_state)
 
 static void migrate_fd_cleanup(MigrationState *s)
 {
+    Error *local_err = NULL;
+
     g_free(s->hostname);
     s->hostname = NULL;
     json_writer_free(s->vmdesc);
@@ -1362,13 +1364,23 @@ static void migrate_fd_cleanup(MigrationState *s)
                           MIGRATION_STATUS_CANCELLED);
     }
 
+    if (!migration_has_failed(s) &&
+        migration_call_notifiers(s, MIG_EVENT_PRECOPY_DONE, &local_err)) {
+
+        migrate_set_state(&s->state, s->state, MIGRATION_STATUS_FAILED);
+        migrate_set_error(s, local_err);
+        error_free(local_err);
+    }
+
     if (s->error) {
         /* It is used on info migrate.  We can't free it */
         error_report_err(error_copy(s->error));
     }
-    migration_call_notifiers(s, s->state == MIGRATION_STATUS_COMPLETED ?
-                             MIG_EVENT_PRECOPY_DONE :
-                             MIG_EVENT_PRECOPY_FAILED);
+
+    if (migration_has_failed(s)) {
+        migration_call_notifiers(s, MIG_EVENT_PRECOPY_FAILED, NULL);
+    }
+
     block_cleanup_parameters();
     yank_unregister_instance(MIGRATION_YANK_INSTANCE);
 }
@@ -1481,13 +1493,15 @@ void migration_remove_notifier(NotifierWithReturn *notify)
     }
 }
 
-void migration_call_notifiers(MigrationState *s, MigrationEventType type)
+int migration_call_notifiers(MigrationState *s, MigrationEventType type,
+                             Error **errp)
 {
     MigMode mode = s->parameters.mode;
     MigrationEvent e;
 
     e.type = type;
-    notifier_with_return_list_notify(&migration_state_notifiers[mode], &e, 0);
+    return notifier_with_return_list_notify(&migration_state_notifiers[mode],
+                                            &e, errp);
 }
 
 bool migration_in_setup(MigrationState *s)
@@ -2535,7 +2549,9 @@ static int postcopy_start(MigrationState *ms, Error **errp)
      * at the transition to postcopy and after the device state; in particular
      * spice needs to trigger a transition now
      */
-    migration_call_notifiers(ms, MIG_EVENT_PRECOPY_DONE);
+    if (migration_call_notifiers(ms, MIG_EVENT_PRECOPY_DONE, errp)) {
+        goto fail;
+    }
 
     migration_downtime_end(ms);
 
@@ -2555,11 +2571,10 @@ static int postcopy_start(MigrationState *ms, Error **errp)
 
     ret = qemu_file_get_error(ms->to_dst_file);
     if (ret) {
-        error_setg(errp, "postcopy_start: Migration stream errored");
-        migrate_set_state(&ms->state, MIGRATION_STATUS_POSTCOPY_ACTIVE,
-                              MIGRATION_STATUS_FAILED);
+        error_setg_errno(errp, -ret, "postcopy_start: Migration stream error");
+        bql_lock();
+        goto fail;
     }
-
     trace_postcopy_preempt_enabled(migrate_postcopy_preempt());
 
     return ret;
@@ -2580,6 +2595,7 @@ fail:
             error_report_err(local_err);
         }
     }
+    migration_call_notifiers(ms, MIG_EVENT_PRECOPY_FAILED, NULL);
     bql_unlock();
     return -1;
 }
@@ -3594,7 +3610,9 @@ void migrate_fd_connect(MigrationState *s, Error *error_in)
         rate_limit = migrate_max_bandwidth();
 
         /* Notify before starting migration thread */
-        migration_call_notifiers(s, MIG_EVENT_PRECOPY_SETUP);
+        if (migration_call_notifiers(s, MIG_EVENT_PRECOPY_SETUP, &local_err)) {
+            goto fail;
+        }
     }
 
     migration_rate_set(rate_limit);
-- 
1.8.3.1



  parent reply	other threads:[~2024-02-08 18:56 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-08 18:53 [PATCH V3 00/13] allow cpr-reboot for vfio Steve Sistare
2024-02-08 18:53 ` [PATCH V3 01/13] notify: pass error to notifier with return Steve Sistare
2024-02-12  9:08   ` David Hildenbrand
2024-02-08 18:53 ` [PATCH V3 02/13] migration: remove error from notifier data Steve Sistare
2024-02-12  9:08   ` David Hildenbrand
2024-02-08 18:53 ` [PATCH V3 03/13] migration: convert to NotifierWithReturn Steve Sistare
2024-02-12  9:10   ` David Hildenbrand
2024-02-08 18:53 ` [PATCH V3 04/13] migration: MigrationEvent for notifiers Steve Sistare
2024-02-12  9:11   ` David Hildenbrand
2024-02-20  6:38   ` Peter Xu
2024-02-08 18:53 ` [PATCH V3 05/13] migration: remove postcopy_after_devices Steve Sistare
2024-02-20  6:42   ` Peter Xu
2024-02-08 18:53 ` [PATCH V3 06/13] migration: MigrationNotifyFunc Steve Sistare
2024-02-12  9:14   ` David Hildenbrand
2024-02-20  6:48   ` Peter Xu
2024-02-08 18:54 ` [PATCH V3 07/13] migration: per-mode notifiers Steve Sistare
2024-02-12  9:16   ` David Hildenbrand
2024-02-20  6:51   ` Peter Xu
2024-02-08 18:54 ` [PATCH V3 08/13] migration: refactor migrate_fd_connect failures Steve Sistare
2024-02-12  9:17   ` David Hildenbrand
2024-02-08 18:54 ` Steve Sistare [this message]
2024-02-12  9:24   ` [PATCH V3 09/13] migration: notifier error checking David Hildenbrand
2024-02-12 15:37     ` Steven Sistare
2024-02-20  7:12   ` Peter Xu
2024-02-20 22:12     ` Steven Sistare
2024-02-08 18:54 ` [PATCH V3 10/13] migration: stop vm for cpr Steve Sistare
2024-02-20  7:33   ` Peter Xu
2024-02-20 22:19     ` Steven Sistare
2024-02-21 21:20     ` Steven Sistare
2024-02-22  9:12       ` Peter Xu
2024-02-22  9:30         ` Peter Xu
2024-02-22 13:29           ` Steven Sistare
2024-02-21 21:23     ` Steven Sistare
2024-02-22  9:03       ` Peter Xu
2024-02-22 13:24         ` Steven Sistare
2024-02-08 18:54 ` [PATCH V3 11/13] vfio: register container " Steve Sistare
2024-02-08 18:54 ` [PATCH V3 12/13] vfio: allow cpr-reboot migration if suspended Steve Sistare
2024-02-21 18:32   ` Steven Sistare
2024-02-08 18:54 ` [PATCH V3 13/13] migration: update cpr-reboot description Steve Sistare
2024-02-20  7:49 ` [PATCH V3 00/13] allow cpr-reboot for vfio Peter Xu
2024-02-20 22:32   ` Steven Sistare
2024-02-21  2:13     ` Peter Xu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1707418446-134863-10-git-send-email-steven.sistare@oracle.com \
    --to=steven.sistare@oracle.com \
    --cc=alex.williamson@redhat.com \
    --cc=clg@redhat.com \
    --cc=david@redhat.com \
    --cc=farosas@suse.de \
    --cc=jasowang@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=mst@redhat.com \
    --cc=peterx@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).