qemu/qapi
Prasad Pandit 93c8a97f99 migration: introduce MIGRATION_STATUS_FAILING
When migration connection is broken, the QEMU and libvirtd(8)
process on the source side receive TCP connection reset
notification. QEMU sets the migration status to FAILED and
proceeds to migration_cleanup(). Meanwhile, Libvirtd(8) sends
a QMP command to migrate_set_capabilities().

The migration_cleanup() and qmp_migrate_set_capabilities()
calls race with each other. When the latter is invoked first,
since the migration is not running (FAILED), migration
capabilities are reset to false, so during migration_cleanup()
the QEMU process crashes with assertion failure.

Introduce a new migration status FAILING and use it as an
interim status when an error occurs. Once migration_cleanup()
is done, it sets the migration status to FAILED. This helps
to avoid the above race condition and ensuing failure.

Interim status FAILING is set wherever the execution moves
towards migration_cleanup():
  - postcopy_start()
  - migration_thread()
  - migration_cleanup()
  - multifd_send_setup()
  - bg_migration_thread()
  - migration_completion()
  - migration_detect_error()
  - bg_migration_completion()
  - multifd_send_error_propagate()
  - migration_connect_error_propagate()

The migration status finally moves to FAILED and reports an
appropriate error to the user.

Interim status FAILING is _NOT_ set in the following routines
because they do not follow the migration_cleanup() path to the
FAILED state:
  - cpr_exec_cb()
  - qemu_savevm_state()
  - postcopy_listen_thread()
  - process_incoming_migration_co()
  - multifd_recv_terminate_threads()
  - migration_channel_process_incoming()

Reviewed-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Prasad Pandit <pjp@fedoraproject.org>
Link: https://lore.kernel.org/qemu-devel/20260224102547.226087-1-ppandit@redhat.com
Signed-off-by: Fabiano Rosas <farosas@suse.de>
2026-03-09 08:53:30 -03:00
..
accelerator.json qapi: Refill doc comments to conform to conventions 2025-11-04 13:34:42 +01:00
acpi-hest.json qapi: Clean up whitespace between definitions 2025-11-04 13:34:42 +01:00
acpi.json qapi: add cross-references to acpi.json 2025-07-14 12:52:46 +02:00
audio.json qapi/audio: Fix description markup of AudiodevDBusOptions @nsamples 2025-11-04 13:34:42 +01:00
authz.json qapi: add cross-references to authz.json 2025-07-14 12:52:46 +02:00
block-core.json block: Never drop BLOCK_IO_ERROR with action=stop for rate limiting 2026-03-06 17:45:15 +01:00
block-export.json qapi: Refill doc comments to conform to conventions 2025-11-04 13:34:42 +01:00
block.json qapi: add cross-references to block layer 2025-07-14 12:55:17 +02:00
char.json chardev: add logtimestamp option 2026-02-13 10:00:02 +01:00
common.json docs/sphinx: remove special parsing for freeform sections 2025-07-14 10:08:27 +02:00
compat.json docs/sphinx: remove special parsing for freeform sections 2025-07-14 10:08:27 +02:00
control.json qapi: add cross-references to misc modules 2025-07-14 12:58:13 +02:00
crypto.json qapi: Clean up whitespace between definitions 2025-11-04 13:34:42 +01:00
cryptodev.json qapi: remove trivial "Returns:" sections 2025-07-14 12:35:29 +02:00
cxl.json hw/cxl/events: Updates for rev3.2 memory module event record 2026-02-20 13:04:45 -05:00
dump.json qapi: Add more cross-references 2025-07-29 14:51:20 +02:00
ebpf.json qapi: add cross-references to misc modules 2025-07-14 12:58:13 +02:00
error.json docs/sphinx: remove special parsing for freeform sections 2025-07-14 10:08:27 +02:00
introspect.json qapi: Refill doc comments to conform to conventions 2025-11-04 13:34:42 +01:00
job.json qapi: Refill doc comments to conform to conventions 2025-11-04 13:34:42 +01:00
machine-common.json qapi: Refill doc comments to conform to conventions 2025-11-04 13:34:42 +01:00
machine-s390x.json qapi: Refill doc comments to conform to conventions 2025-11-04 13:34:42 +01:00
machine.json Remove the qemu-system-microblazeel target from the build 2026-03-02 09:48:10 +01:00
meson.build qapi/acpi-hest: add an interface to do generic CPER error injection 2025-10-05 08:06:32 -04:00
migration.json migration: introduce MIGRATION_STATUS_FAILING 2026-03-09 08:53:30 -03:00
misc-arm.json qapi: add cross-references to misc modules 2025-07-14 12:58:13 +02:00
misc-i386.json qapi: Clean up whitespace between definitions 2025-11-04 13:34:42 +01:00
misc.json qapi: add cross-references to misc modules 2025-07-14 12:58:13 +02:00
net.json qapi: Clean up whitespace between definitions 2025-11-04 13:34:42 +01:00
opts-visitor.c qapi: Inline and remove QERR_INVALID_PARAMETER definition 2024-04-24 09:50:58 +02:00
pci.json qapi: add cross-references to pci.json 2025-07-14 12:58:13 +02:00
pragma.json qapi/migration: Don't document MigrationParameter 2025-12-23 09:24:34 -05:00
qapi-clone-visitor.c qapi: Move include/qapi/qmp/ to include/qobject/ 2025-02-10 15:33:16 +01:00
qapi-dealloc-visitor.c qapi: Move include/qapi/qmp/ to include/qobject/ 2025-02-10 15:33:16 +01:00
qapi-forward-visitor.c qapi: change 'unsigned special_features' to 'uint64_t features' 2025-02-10 15:45:04 +01:00
qapi-schema.json qapi/acpi-hest: add an interface to do generic CPER error injection 2025-10-05 08:06:32 -04:00
qapi-type-helpers.c qapi: New strv_from_str_list() 2024-03-04 07:12:40 +01:00
qapi-util.c qapi: change 'unsigned special_features' to 'uint64_t features' 2025-02-10 15:45:04 +01:00
qapi-visit-core.c qapi: change 'unsigned special_features' to 'uint64_t features' 2025-02-10 15:45:04 +01:00
qdev.json qapi: Refill doc comments to conform to conventions 2025-11-04 13:34:42 +01:00
qmp-dispatch.c block: rename block/aio.h to qemu/aio.h 2025-12-27 10:11:12 +01:00
qmp-event.c qapi: Move include/qapi/qmp/ to include/qobject/ 2025-02-10 15:33:16 +01:00
qmp-registry.c qapi: change 'unsigned special_features' to 'uint64_t features' 2025-02-10 15:45:04 +01:00
qobject-input-visitor.c qapi: change 'unsigned special_features' to 'uint64_t features' 2025-02-10 15:45:04 +01:00
qobject-output-visitor.c qapi: change 'unsigned special_features' to 'uint64_t features' 2025-02-10 15:45:04 +01:00
qom.json qom: add 'confidential-guest-reset' property for x86 confidential vms 2026-02-27 14:48:04 +01:00
replay.json qapi: add cross-references to replay.json 2025-07-14 12:58:13 +02:00
rocker.json qapi: remove trivial "Returns:" sections 2025-07-14 12:35:29 +02:00
run-state.json target/i386: convert SEV-ES termination requests to guest panic events 2026-02-07 14:31:38 +01:00
sockets.json qapi: Refill doc comments to conform to conventions 2025-11-04 13:34:42 +01:00
stats.json qapi: Refill doc comments to conform to conventions 2025-11-04 13:34:42 +01:00
string-input-visitor.c qapi: Move include/qapi/qmp/ to include/qobject/ 2025-02-10 15:33:16 +01:00
string-output-visitor.c string-output-visitor: Fix (pseudo) struct handling 2024-01-26 11:16:58 +01:00
tpm.json qapi: remove trivial "Returns:" sections 2025-07-14 12:35:29 +02:00
trace-events qapi: Generalize struct member policy checking 2021-10-29 18:23:09 +02:00
trace.h trace: switch position of headers to what Meson requires 2020-08-21 06:18:24 -04:00
trace.json qapi: rephrase return docs to avoid type name 2025-07-14 12:35:39 +02:00
transaction.json qapi: add cross-references to block layer 2025-07-14 12:55:17 +02:00
uefi.json docs/sphinx: remove special parsing for freeform sections 2025-07-14 10:08:27 +02:00
ui.json qapi: Clean up whitespace between definitions 2025-11-04 13:34:42 +01:00
vfio.json vfio/migration: Send VFIO_MIGRATION event before PRE_COPY_P2P transition 2026-02-18 10:54:57 +01:00
virtio.json Support per-head resolutions with virtio-gpu 2026-03-06 17:25:47 +00:00
yank.json qapi: add cross-references to yank.json 2025-07-14 12:58:13 +02:00