From: no-reply@sashiko.virtuozzo.com
To: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>,
svt-core@virtuozzo.com
Cc: andrey.drobyshev@virtuozzo.com
Subject: Re: [PATCH QEMU HCI-8.1 v3 14/28] migration: yank: Move register instance earlier
Date: Fri, 16 Oct 2026 15:41:14 +0000 [thread overview]
Message-ID: <010701a1455fe4c8-3eeb58b3-a873-41d4-a71f-71af90706cd0-000000@eu-central-1.amazonses.com> (raw)
In-Reply-To: <20261016-vfio_v1-v3-14-47487cb5a8e5@virtuozzo.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] migration: stale incoming_postcopy_state makes migrate_prepare() refuse all later outgoing migrations
- [Medium] migration: migrate_prepare() registers yank with &error_abort, aborting QEMU if cleanup is pending
--
Commit ce0aafa8f0f4f6ebc0a21db9c39794339fc1b277
Author: Fabiano Rosas <farosas@suse.de>
migration: yank: Move register instance earlier
This commit moves yank_register_instance() into migrate_prepare() so it
pairs with the unregister in migration_cleanup(). It also adds a guard
that refuses a non-resume migrate while an incoming postcopy migration is
in progress, and reworks the error-path unregister logic in
qmp_migrate() and qmp_migrate_finish().
Link: https://lore.kernel.org/qemu-devel/20260123141656.6765-11-farosas@suse.de
> diff --git a/migration/migration.c b/migration/migration.c
> index 2f8ef20c0369..0b8309565323 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
[ ... ]
> @@ -2174,6 +2174,15 @@ static bool migrate_prepare(MigrationState *s, bool resume, Error **errp)
> return false;
> }
>
> + /*
> + * The guest already runs during incoming postcopy, but the incoming
> + * migration still holds the yank instance registered below.
> + */
> + if (migration_incoming_postcopy_advised()) {
> + error_setg(errp, "Incoming postcopy migration is still in progress");
> + return false;
> + }
> +
[Severity: High]
Can this guard reject every later outgoing migrate on a VM whose incoming
migration has already finished?
migration_incoming_postcopy_advised() evaluates:
PostcopyState ps = postcopy_state_get();
return ps >= POSTCOPY_INCOMING_ADVISE && ps < POSTCOPY_INCOMING_END;
Only the postcopy listen thread ever sets POSTCOPY_INCOMING_END. Consider
this sequence on the destination with postcopy-ram enabled:
loadvm_postcopy_handle_advise()
postcopy_state_set(POSTCOPY_INCOMING_ADVISE);
(the len == 0 case with !migrate_postcopy_ram() also returns 0
without resetting the state)
Precopy then completes without postcopy starting, so LISTEN and the
listen thread never run:
process_incoming_migration_co()
if (ps == POSTCOPY_INCOMING_ADVISE) {
postcopy_ram_incoming_cleanup(mis);
}
...
process_incoming_migration_bh()
migration_incoming_state_destroy() <- yank instance released here
postcopy_ram_incoming_cleanup() does not reset the state, and none of the
other postcopy_state_set() callers run on this path or on the ret < 0
fail: path. The state therefore stays at ADVISE (or DISCARD, LISTENING or
RUNNING after some failures).
After that, migration_incoming_postcopy_advised() stays true, and every
non-resume QMP migrate returns "Incoming postcopy migration is still in
progress", even though the incoming side no longer holds the yank
instance. Chained migration (A->B->C) looks like a realistic trigger.
The refusal appears to last until a new incoming migration starts or QEMU
is restarted.
I did not find anything later in the series that resets the state or
narrows this check.
Should the guard test whether the incoming side still holds the yank
instance, or should the postcopy state be reset when incoming migration
finishes or fails?
[ ... ]
> @@ -2235,11 +2244,12 @@ static bool migrate_prepare(MigrationState *s, bool resume, Error **errp)
> return false;
> }
>
> + yank_register_instance(MIGRATION_YANK_INSTANCE, &error_abort);
> +
> return true;
> }
[Severity: Medium]
Can this abort QEMU instead of returning a QMP error when the previous
outgoing migration's cleanup has not run yet?
The unregister is the last step of migration_cleanup(), which runs only
from the bottom half scheduled in migration_iteration_finish():
migration_thread()
s->state set to FAILED (or COMPLETED)
migration_iteration_finish()
bql_lock();
...
migration_bh_schedule(migration_cleanup_bh, s);
bql_unlock();
Between the terminal state change and the bottom half running, the main
loop can process a QMP migrate command. In that window
migration_is_running() returns false, since FAILED, CANCELLED and
COMPLETED fall into its default case:
case MIGRATION_STATUS_CANCELLING:
case MIGRATION_STATUS_COLO:
return true;
default:
return false;
The RUN_STATE_POSTMIGRATE check does not catch it either, as that is set
later in migration_iteration_finish(). migrate_init() does not look at a
pending cleanup. So migrate_prepare() can reach:
yank_register_instance(MIGRATION_YANK_INSTANCE, &error_abort);
while the old instance is still registered. yank_register_instance() then
does error_setg(errp, "duplicate yank instance"), which with &error_abort
calls abort().
Before this patch the registration in qmp_migrate_finish() used the
caller's errp, so the same race produced a QMP error.
The commit message adds a guard for the incoming postcopy case for this
reason, but nothing similar covers the outgoing cleanup-pending window.
The later patches through the series end do not change this.
Could this use a non-fatal errp and return an error from migrate_prepare()
instead, or could migrate_prepare() reject the request while cleanup is
still pending?
[ ... ]
--
Sashiko AI review · https://sashiko.vzint.dev/#/patchset/20261016-vfio_v1-v3-0-47487cb5a8e5@virtuozzo.com?part=14
next prev parent reply other threads:[~2026-10-16 15:41 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-16 15:25 [PATCH QEMU HCI-8.1 v3 00/28] vfio: support qemu-update with passed through GPU's and vGPU's #VSTOR-103860 Andrey Drobyshev
2026-10-16 15:25 ` [PATCH QEMU HCI-8.1 v3 01/28] VZ: migration/cpr-exec: fix Error leak in preserve_ram() Andrey Drobyshev
2026-10-16 15:28 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 02/28] migration/cpr-exec: restore RAM write access if exec fails Andrey Drobyshev
2026-10-16 15:28 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 03/28] vfio/region: create BAR dma-bufs with O_CLOEXEC Andrey Drobyshev
2026-10-16 15:30 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 04/28] migration: Plug memory leaks after migrate_set_error() Andrey Drobyshev
2026-10-16 15:29 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 05/28] hw/vfio: Fix liveness check in vfio_connect_kvm_msi_virq() Andrey Drobyshev
2026-10-16 15:30 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 06/28] vfio/pci: Reject invalid MSI-X Table and PBA BIR values Andrey Drobyshev
2026-10-16 15:30 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 07/28] vfio/pci: Fix information leak in vfio_rom_read() Andrey Drobyshev
2026-10-16 15:31 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 08/28] vfio/pci: Initialize rom_read_failed in vfio_pci_load_rom() Andrey Drobyshev
2026-10-16 15:32 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 09/28] vfio/pci: Grow buffer in vfio_pci_host_match() Andrey Drobyshev
2026-10-16 15:31 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 10/28] q35: Fix migration of SMRAM state Andrey Drobyshev
2026-10-16 15:33 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 11/28] migration: ensure APIC is loaded prior to VFIO PCI devices Andrey Drobyshev
2026-10-16 15:32 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 12/28] migration: Fix regression of passing error_fatal into vmstate_load_state() Andrey Drobyshev
2026-10-16 15:35 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 13/28] migration: vmstate_save_state_v: fix double error_setg Andrey Drobyshev
2026-10-16 15:38 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 14/28] migration: yank: Move register instance earlier Andrey Drobyshev
2026-10-16 15:41 ` no-reply [this message]
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 15/28] migration: Free cpr-transfer MigrationAddress along with gsource Andrey Drobyshev
2026-10-16 15:39 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 16/28] migration: Move CPR HUP watch to cpr-transfer.c Andrey Drobyshev
2026-10-16 15:40 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 17/28] migration: Fix crash on second migration when cancel early Andrey Drobyshev
2026-10-16 15:44 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 18/28] kvm: tolerate ioctls after kvm_close() Andrey Drobyshev
2026-10-16 15:44 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 19/28] kvm: fix coalesced MMIO flush racing with kvm_close() Andrey Drobyshev
2026-10-16 15:46 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 20/28] migration/cpr: add cpr_is_in_progress() Andrey Drobyshev
2026-10-16 15:46 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 21/28] vfio/migration: don't migrate device state during CPR Andrey Drobyshev
2026-10-16 15:55 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 22/28] vfio/listener: skip dirty page tracking " Andrey Drobyshev
2026-10-16 15:50 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 23/28] VZ: vfio/cpr: don't close KVM on cpr-exec Andrey Drobyshev
2026-10-16 15:52 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 24/28] VZ: migration/cpr-exec: abort cpr-exec if memory can't be preserved Andrey Drobyshev
2026-10-16 15:55 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 25/28] VZ: migration/cpr-exec: take the vhost-net devices back if exec fails Andrey Drobyshev
2026-10-16 15:58 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 26/28] VZ: migration/cpr-exec: don't exec if a vhost-net device can't be released Andrey Drobyshev
2026-10-16 15:56 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 27/28] VZ: vfio/region: preserve BAR mappings across cpr-exec #VSTOR-103860 Andrey Drobyshev
2026-10-16 16:02 ` no-reply
2026-10-16 15:26 ` [PATCH QEMU HCI-8.1 v3 28/28] VZ: migration/cpr-exec: allow cpr-exec with VFIO devices #VSTOR-103860 Andrey Drobyshev
2026-10-16 15:59 ` no-reply
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=010701a1455fe4c8-3eeb58b3-a873-41d4-a71f-71af90706cd0-000000@eu-central-1.amazonses.com \
--to=no-reply@sashiko.virtuozzo.com \
--cc=andrey.drobyshev@virtuozzo.com \
--cc=svt-core@virtuozzo.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.