From: Peter Xu <peterx@redhat.com>
To: "Philippe Mathieu-Daudé" <philmd@oss.qualcomm.com>
Cc: "Avihai Horon" <avihaih@nvidia.com>,
qemu-devel@nongnu.org, "Alex Williamson" <alex@shazbot.org>,
"Cédric Le Goater" <clg@redhat.com>,
"Fabiano Rosas" <farosas@suse.de>,
"Pierrick Bouvier" <pierrick.bouvier@oss.qualcomm.com>,
"Zhao Liu" <zhao1.liu@intel.com>,
"Halil Pasic" <pasic@linux.ibm.com>,
"Christian Borntraeger" <borntraeger@linux.ibm.com>,
"Jason Herne" <jjherne@linux.ibm.com>,
"Richard Henderson" <richard.henderson@linaro.org>,
"Ilya Leoshkevich" <iii@linux.ibm.com>,
"David Hildenbrand" <david@kernel.org>,
"Eric Farman" <farman@linux.ibm.com>,
"Matthew Rosato" <mjrosato@linux.ibm.com>,
"Cornelia Huck" <cohuck@redhat.com>,
"Eric Blake" <eblake@redhat.com>,
"Vladimir Sementsov-Ogievskiy" <vsementsov@yandex-team.ru>,
"John Snow" <jsnow@redhat.com>,
"Markus Armbruster" <armbru@redhat.com>,
"Maor Gottlieb" <maorg@nvidia.com>
Subject: Re: [PATCH v3 01/14] migration: Propagate errors in migration_completion_precopy()
Date: Fri, 12 Jun 2026 12:03:39 -0400 [thread overview]
Message-ID: <aiwt2_I2wK6FBJnO@x1.local> (raw)
In-Reply-To: <775738ae-3a47-4ee6-900c-56ba77b4185e@oss.qualcomm.com>
On Tue, Jun 09, 2026 at 02:11:00PM +0200, Philippe Mathieu-Daudé wrote:
> On 9/6/26 09:57, Avihai Horon wrote:
> > migration_completion_precopy() doesn't propagate errors to migration
> > core which leads to error information loss. Fix that.
> >
> > This prepares for a follow-up where migration_switchover_start() can
> > fail on switchover-ack and still report a useful error.
> >
> > Signed-off-by: Avihai Horon <avihaih@nvidia.com>
> > ---
> > migration/savevm.h | 2 +-
> > migration/migration.c | 13 ++++++++-----
> > migration/savevm.c | 29 +++++++++++++++++------------
> > 3 files changed, 26 insertions(+), 18 deletions(-)
> >
> > diff --git a/migration/savevm.h b/migration/savevm.h
> > index 96fdf96d4e..b6bb4fa977 100644
> > --- a/migration/savevm.h
> > +++ b/migration/savevm.h
> > @@ -44,7 +44,7 @@ void qemu_savevm_state_header(QEMUFile *f);
> > int qemu_savevm_state_iterate(QEMUFile *f, bool postcopy);
> > void qemu_savevm_state_cleanup(void);
> > void qemu_savevm_state_complete_postcopy(QEMUFile *f);
> > -int qemu_savevm_state_complete_precopy(MigrationState *s);
> > +int qemu_savevm_state_complete_precopy(MigrationState *s, Error **errp);
> > void qemu_savevm_query_pending(MigPendingData *pending, bool exact);
> > int qemu_savevm_state_complete_precopy_iterable(QEMUFile *f, bool in_postcopy);
> > bool qemu_savevm_state_postcopy_prepare(QEMUFile *f, Error **errp);
> > diff --git a/migration/migration.c b/migration/migration.c
> > index 074d3f2c69..aad23f3228 100644
> > --- a/migration/migration.c
> > +++ b/migration/migration.c
> > @@ -2814,7 +2814,7 @@ static bool migration_switchover_start(MigrationState *s, Error **errp)
> > return true;
> > }
> > -static int migration_completion_precopy(MigrationState *s)
> > +static int migration_completion_precopy(MigrationState *s, Error **errp)
> > {
> > int ret;
> > @@ -2823,16 +2823,17 @@ static int migration_completion_precopy(MigrationState *s)
> > if (!migrate_mode_is_cpr()) {
> > ret = migration_stop_vm(s, RUN_STATE_FINISH_MIGRATE);
> > if (ret < 0) {
> > + error_setg_errno(errp, -ret, "Failed to stop the VM");
> > goto out_unlock;
> > }
> > }
> > - if (!migration_switchover_start(s, NULL)) {
> > + if (!migration_switchover_start(s, errp)) {
> > ret = -EFAULT;
>
> This function should now returns a boolean IMHO.
>
> > goto out_unlock;
> > }
> > - ret = qemu_savevm_state_complete_precopy(s);
> > + ret = qemu_savevm_state_complete_precopy(s, errp);
> > out_unlock:
> > bql_unlock();
> > return ret;
> > @@ -2869,7 +2870,7 @@ static void migration_completion(MigrationState *s)
> > Error *local_err = NULL;
> > if (s->state == MIGRATION_STATUS_ACTIVE) {
> > - ret = migration_completion_precopy(s);
> > + ret = migration_completion_precopy(s, &local_err);
> > } else if (s->state == MIGRATION_STATUS_POSTCOPY_ACTIVE) {
> > migration_completion_postcopy(s);
> > } else {
> > @@ -2900,7 +2901,9 @@ static void migration_completion(MigrationState *s)
> > return;
> > fail:
> > - if (qemu_file_get_error_obj(s->to_dst_file, &local_err)) {
> > + if (local_err) {
> > + migrate_error_propagate(s, local_err);
> > + } else if (qemu_file_get_error_obj(s->to_dst_file, &local_err)) {
>
> if (local_err
> || qemu_file_get_error_obj(s->to_dst_file, &local_err)) {
>
> > migrate_error_propagate(s, local_err);
> > } else if (ret) {
> > error_setg_errno(&local_err, -ret, "Error in migration completion");
> > diff --git a/migration/savevm.c b/migration/savevm.c
> > index 23adaf9dd9..9d1d58c8f4 100644
> > --- a/migration/savevm.c
> > +++ b/migration/savevm.c
> > @@ -1771,28 +1771,34 @@ int qemu_savevm_state_non_iterable(QEMUFile *f, Error **errp)
> > return 0;
> > }
> > -int qemu_savevm_state_complete_precopy(MigrationState *s)
> > +int qemu_savevm_state_complete_precopy(MigrationState *s, Error **errp)
> > {
> > + ERRP_GUARD();
> > QEMUFile *f = s->to_dst_file;
> > - Error *local_err = NULL;
> > int ret;
> > ret = qemu_savevm_state_complete_precopy_iterable(f, false);
> > if (ret) {
> > + qemu_file_get_error_obj(f, errp);
> > + error_prepend(errp, "Failed to save iterable device state: ");
> > return ret;
> > }
> > - /* TODO: pass error upper */
> > - ret = qemu_savevm_state_non_iterable(f, &local_err);
> > + ret = qemu_savevm_state_non_iterable(f, errp);
> > if (ret) {
> > - migrate_error_propagate(s, error_copy(local_err));
> > - error_report_err(local_err);
> > return ret;
> > }
> > qemu_savevm_state_end_precopy(s, f);
> > - return qemu_fflush(f);
> > + ret = qemu_fflush(f);
> > + if (ret) {
> > + qemu_file_get_error_obj(f, errp);
> > + error_prepend(errp, "%s: Failed to flush QEMUFile", __func__);
>
> Ditto, directly return boolean.
>
> Anyway can be done on top, so:
Agreed, I didn't mention this because I know touching the retval needs
further touch callers. Can be done on top.
> Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
--
Peter Xu
next prev parent reply other threads:[~2026-06-12 16:04 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-09 7:57 [PATCH v3 00/14] Make switchover-ack re-usable and add VFIO precopy REINIT feature Avihai Horon
2026-06-09 7:57 ` [PATCH v3 01/14] migration: Propagate errors in migration_completion_precopy() Avihai Horon
2026-06-09 12:11 ` Philippe Mathieu-Daudé
2026-06-12 16:03 ` Peter Xu [this message]
2026-06-14 9:34 ` Avihai Horon
2026-06-09 7:58 ` [PATCH v3 02/14] migration/ram: Use migration_bitmap_sync_precopy() for postcopy discard Avihai Horon
2026-06-12 15:59 ` Peter Xu
2026-06-09 7:58 ` [PATCH v3 03/14] migration: Run final save_query_pending at switchover Avihai Horon
2026-06-12 16:03 ` Peter Xu
2026-06-09 7:58 ` [PATCH v3 04/14] migration: Log the approver in qemu_loadvm_approve_switchover() Avihai Horon
2026-06-09 7:58 ` [PATCH v3 05/14] migration: Replace switchover_ack_needed SaveVMHandler Avihai Horon
2026-06-09 7:58 ` [PATCH v3 06/14] migration: Rename switchover-ack code to legacy Avihai Horon
2026-06-09 7:58 ` [PATCH v3 07/14] migration: Make switchover-ack re-usable Avihai Horon
2026-06-12 16:16 ` Peter Xu
2026-06-14 9:50 ` Avihai Horon
2026-06-15 13:34 ` Peter Xu
2026-06-15 14:35 ` Avihai Horon
2026-06-09 7:58 ` [PATCH v3 08/14] migration: Fail migration if switchover-ack is requested after switchover decision Avihai Horon
2026-06-12 16:17 ` Peter Xu
2026-06-09 7:58 ` [PATCH v3 09/14] vfio/migration: Extract VFIO_MIG_FLAG_DEV_INIT_DATA_SENT sending to helper Avihai Horon
2026-06-09 7:58 ` [PATCH v3 10/14] vfio/migration: Add Error ** parameter to vfio_migration_init() Avihai Horon
2026-06-09 12:09 ` Cédric Le Goater
2026-06-09 7:58 ` [PATCH v3 11/14] vfio/migration: Add new switchover-ack mechanism Avihai Horon
2026-06-09 7:58 ` [PATCH v3 12/14] vfio/migration: Implement VFIO_PRECOPY_INFO_REINIT feature Avihai Horon
2026-06-09 7:58 ` [PATCH v3 13/14] vfio/migration: Check VFIO_PRECOPY_INFO_REINIT during switchover Avihai Horon
2026-06-12 16:22 ` Peter Xu
2026-06-09 7:58 ` [PATCH v3 14/14] migration: Enable new switchover-ack Avihai Horon
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=aiwt2_I2wK6FBJnO@x1.local \
--to=peterx@redhat.com \
--cc=alex@shazbot.org \
--cc=armbru@redhat.com \
--cc=avihaih@nvidia.com \
--cc=borntraeger@linux.ibm.com \
--cc=clg@redhat.com \
--cc=cohuck@redhat.com \
--cc=david@kernel.org \
--cc=eblake@redhat.com \
--cc=farman@linux.ibm.com \
--cc=farosas@suse.de \
--cc=iii@linux.ibm.com \
--cc=jjherne@linux.ibm.com \
--cc=jsnow@redhat.com \
--cc=maorg@nvidia.com \
--cc=mjrosato@linux.ibm.com \
--cc=pasic@linux.ibm.com \
--cc=philmd@oss.qualcomm.com \
--cc=pierrick.bouvier@oss.qualcomm.com \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=vsementsov@yandex-team.ru \
--cc=zhao1.liu@intel.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.