From: no-reply@sashiko.virtuozzo.com
To: svt-core@virtuozzo.com,
Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>
Cc: andrey.drobyshev@virtuozzo.com
Subject: Re: [PATCH QEMU HCI-8.1 v7 35/35] VZ: vfio/migration: don't wait for stop-copy-only device state #VSTOR-141821
Date: Tue, 3 Nov 2026 14:35:22 +0000 [thread overview]
Message-ID: <010701a1a1d60f30-c13cf530-2cf8-41d3-bba0-3eb7b814ab0e-000000@eu-central-1.amazonses.com> (raw)
In-Reply-To: <20261103-vfio_v1-v7-35-4467fdccbbe6@virtuozzo.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [Medium] vfio/migration: stop-copy size dropped from pending, so downtime-limit is bypassed
- [Low] vfio: comment in vfio_state_pending_exact() misdescribes error fallback
--
commit 4741edc5da3eca96f6669a6d5a3ce9d95caac4ae
Author: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>
VZ: vfio/migration: don't wait for stop-copy-only device state #VSTOR-141821
This patch changes vfio_state_pending_exact() so that the VFIO stop-copy size is added to *must_precopy only when a query failed or the device still has pre-copy data. Devices without pre-copy support, and pre-copy devices that have drained, no longer have their stop-copy state counted toward the switchover decision.
> diff --git a/hw/vfio/migration.c b/hw/vfio/migration.c
> --- a/hw/vfio/migration.c
> +++ b/hw/vfio/migration.c
[ ... ]
> @@ -569,16 +569,24 @@ static void vfio_state_pending_exact(void *opaque, uint64_t *must_precopy,
> VFIODevice *vbasedev = opaque;
> VFIOMigration *migration = vbasedev->migration;
> uint64_t stop_copy_size = VFIO_MIG_STOP_COPY_SIZE;
> + int ret;
>
> /*
> - * If getting pending migration size fails, VFIO_MIG_STOP_COPY_SIZE is
> - * reported so downtime limit won't be violated.
> + * If getting the pending sizes fails, VFIO_MIG_STOP_COPY_SIZE is
> + * reported, unconditionally, so the switchover isn't taken blindly.
> */
> - vfio_query_stop_copy_size(vbasedev, &stop_copy_size);
> - *must_precopy += stop_copy_size;
> + ret = vfio_query_stop_copy_size(vbasedev, &stop_copy_size);
>
> if (vfio_device_state_is_precopy(vbasedev)) {
> - vfio_query_precopy_size(migration);
> + ret |= vfio_query_precopy_size(migration);
> + }
[Severity: Low]
This isn't a bug, but is the new comment accurate?
It says that if getting the pending sizes fails, VFIO_MIG_STOP_COPY_SIZE is reported unconditionally. That only holds when vfio_query_stop_copy_size() itself fails, because only then does stop_copy_size keep its initial value.
If vfio_query_stop_copy_size() succeeds and vfio_query_precopy_size() then fails, ret is non-zero. The real stop_copy_length value is added to *must_precopy, not VFIO_MIG_STOP_COPY_SIZE.
vfio_query_precopy_size() also zeroes precopy_init_size and precopy_dirty_size in that case, so the trace event shows 0 for both. Could the comment be reworded to match this?
> +
> + /*
> + * Once there's nothing left to pre-copy, the stop-copy state can't
> + * shrink by iterating: don't let it hold up the switchover.
> + */
> + if (ret || migration->precopy_init_size || migration->precopy_dirty_size) {
> + *must_precopy += stop_copy_size;
> }
[Severity: Medium]
Does this gate let the switchover happen while a large stop-copy state still has to be sent with the guest paused?
The switchover decision in migration_iteration_run() depends only on the reported pending size:
complete_ready = can_switchover && (pending_size <= s->threshold_size);
With stop_copy_size left out of *must_precopy, this can become true even when the device state is much larger than bandwidth x downtime-limit. The commit message acknowledges that "the downtime limit no longer bounds the time that state takes to send".
Two cases make the gate false:
1) A device without VFIO_MIGRATION_PRE_COPY never reaches vfio_query_precopy_size(), because vfio_device_state_is_precopy() is false. precopy_init_size and precopy_dirty_size stay 0, so its stop-copy state is never counted, however large it is. vfio_state_pending_estimate() also returns early for such a device:
if (!vfio_device_state_is_precopy(vbasedev)) {
return;
}
so no other handler accounts for that state.
2) A pre-copy device whose query returns 0/0 at a single sampling instant is treated as drained, although the guest is still running. Can stop_copy_length grow after that sample? The comment "can't shrink by iterating" says nothing about whether the size is final once 0/0 is read.
There is no per-device or per-driver opt-in here, so every VFIO device is affected, not only the vGPU case described in the commit message. Would it make sense to limit this behaviour to devices known to need it, or to make it configurable?
--
Sashiko AI review · https://sashiko.vzint.dev/#/patchset/20261103-vfio_v1-v7-0-4467fdccbbe6@virtuozzo.com?part=35
next prev parent reply other threads:[~2026-11-03 14:35 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-03 13:57 [PATCH QEMU HCI-8.1 v7 00/35] vfio: support qemu-update with passed through GPU's and vGPU's #VSTOR-103860 Andrey Drobyshev
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 01/35] VZ: migration/cpr-exec: fix Error leak in preserve_ram() Andrey Drobyshev
2026-11-03 14:00 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 02/35] migration/cpr-exec: restore RAM write access if exec fails Andrey Drobyshev
2026-11-03 14:01 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 03/35] vfio/region: create BAR dma-bufs with O_CLOEXEC Andrey Drobyshev
2026-11-03 14:02 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 04/35] migration/cpr-exec: require a file or exec migration URI Andrey Drobyshev
2026-11-03 14:02 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 05/35] migration: close the CPR state if the outgoing channel fails to open Andrey Drobyshev
2026-11-03 14:03 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 06/35] migration/cpr-exec: close the persisted state if the " Andrey Drobyshev
2026-11-03 14:04 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 07/35] migration/cpr-exec: don't leak the dup'd memfd if g_setenv() fails Andrey Drobyshev
2026-11-03 14:04 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 08/35] migration: don't refuse a blocker over a migration of another mode Andrey Drobyshev
2026-11-03 14:05 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 09/35] migration: Plug memory leaks after migrate_set_error() Andrey Drobyshev
2026-11-03 14:05 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 10/35] hw/vfio: Fix liveness check in vfio_connect_kvm_msi_virq() Andrey Drobyshev
2026-11-03 14:05 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 11/35] vfio/pci: Reject invalid MSI-X Table and PBA BIR values Andrey Drobyshev
2026-11-03 14:05 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 12/35] vfio/pci: Fix information leak in vfio_rom_read() Andrey Drobyshev
2026-11-03 14:06 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 13/35] vfio/pci: Initialize rom_read_failed in vfio_pci_load_rom() Andrey Drobyshev
2026-11-03 14:06 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 14/35] vfio/pci: Grow buffer in vfio_pci_host_match() Andrey Drobyshev
2026-11-03 14:06 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 15/35] q35: Fix migration of SMRAM state Andrey Drobyshev
2026-11-03 14:08 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 16/35] migration: ensure APIC is loaded prior to VFIO PCI devices Andrey Drobyshev
2026-11-03 14:08 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 17/35] migration: Fix regression of passing error_fatal into vmstate_load_state() Andrey Drobyshev
2026-11-03 14:11 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 18/35] migration: vmstate_save_state_v: fix double error_setg Andrey Drobyshev
2026-11-03 14:11 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 19/35] migration: yank: Move register instance earlier Andrey Drobyshev
2026-11-03 14:16 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 20/35] migration: Free cpr-transfer MigrationAddress along with gsource Andrey Drobyshev
2026-11-03 14:14 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 21/35] migration: Move CPR HUP watch to cpr-transfer.c Andrey Drobyshev
2026-11-03 14:14 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 22/35] migration: Fix crash on second migration when cancel early Andrey Drobyshev
2026-11-03 14:16 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 23/35] kvm: tolerate ioctls after kvm_close() Andrey Drobyshev
2026-11-03 14:21 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 24/35] kvm: fix coalesced MMIO flush racing with kvm_close() Andrey Drobyshev
2026-11-03 14:19 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 25/35] migration/cpr: add cpr_is_in_progress() Andrey Drobyshev
2026-11-03 14:21 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 26/35] vfio/migration: don't migrate device state during CPR Andrey Drobyshev
2026-11-03 14:26 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 27/35] vfio/migration: don't assume the device is running on CPR incoming Andrey Drobyshev
2026-11-03 14:25 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 28/35] migration/ram: don't start dirty logging in CPR modes Andrey Drobyshev
2026-11-03 14:27 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 29/35] VZ: vfio/cpr: don't close KVM on cpr-exec Andrey Drobyshev
2026-11-03 14:29 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 30/35] VZ: migration/cpr-exec: abort cpr-exec if memory can't be preserved Andrey Drobyshev
2026-11-03 14:29 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 31/35] VZ: migration/cpr-exec: take the vhost-net devices back if exec fails Andrey Drobyshev
2026-11-03 14:32 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 32/35] VZ: migration/cpr-exec: don't exec if a vhost-net device can't be released Andrey Drobyshev
2026-11-03 14:30 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 33/35] VZ: vfio/region: preserve BAR mappings across cpr-exec #VSTOR-103860 Andrey Drobyshev
2026-11-03 14:38 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 34/35] VZ: migration/cpr-exec: allow cpr-exec with VFIO devices #VSTOR-103860 Andrey Drobyshev
2026-11-03 14:33 ` no-reply
2026-11-03 13:57 ` [PATCH QEMU HCI-8.1 v7 35/35] VZ: vfio/migration: don't wait for stop-copy-only device state #VSTOR-141821 Andrey Drobyshev
2026-11-03 14:35 ` no-reply [this message]
2026-11-04 13:11 ` [PATCH QEMU HCI-8.1 v7 00/35] vfio: support qemu-update with passed through GPU's and vGPU's #VSTOR-103860 Denis V. Lunev
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=010701a1a1d60f30-c13cf530-2cf8-41d3-bba0-3eb7b814ab0e-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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox