migration: Rename switchover-ack code to legacy
A new switchover-ack mechanism will be added in the following patches. However, the old mechanism must still be kept for backward compatibility. Rename existing code that will be used only for old switchover-ack mechanism as legacy. This will help to distinguish legacy code from new code and make it more readable and easier for removal later when no longer needed. No functional change intended. Reviewed-by: Peter Xu <peterx@redhat.com> Signed-off-by: Avihai Horon <avihaih@nvidia.com> Link: https://lore.kernel.org/qemu-devel/20260706085211.13905-7-avihaih@nvidia.com Signed-off-by: Cédric Le Goater <clg@redhat.com>
Avihai Horon committed
Jul 6, 2026 at 11:52 UTC
d55f1cf24f147957c5af0fdd9894525cb17578ae
6 files changed
+44
-27
hw/vfio/migration.c
+3
-3
@@ -487,11 +487,11 @@ static bool vfio_precopy_supported(VFIODevice *vbasedev)
487
return migration->mig_flags & VFIO_MIGRATION_PRE_COPY;
488
}
489
490
-static void vfio_request_switchover_ack(VFIODevice *vbasedev)
490
+static void vfio_request_switchover_ack_legacy(VFIODevice *vbasedev)
491
{
492
if (vfio_precopy_supported(vbasedev)) {
493
/* Precopy support implies switchover-ack is needed */
494
- migration_request_switchover_ack(vbasedev->name);
494
+ migration_request_switchover_ack_legacy(vbasedev->name);
495
}
496
}
497
@@ -784,7 +784,7 @@ static int vfio_load_setup(QEMUFile *f, void *opaque, Error **errp)
784
return ret;
785
}
786
787
- vfio_request_switchover_ack(vbasedev);
787
+ vfio_request_switchover_ack_legacy(vbasedev);
788
789
return 0;
790
}
include/migration/misc.h
+1
-1
@@ -159,6 +159,6 @@ bool multifd_device_state_save_thread_should_exit(void);
159
void multifd_abort_device_state_save_threads(void);
160
bool multifd_join_device_state_save_threads(void);
161
162
-void migration_request_switchover_ack(const char *requester);
162
+void migration_request_switchover_ack_legacy(const char *requester);
163
164
#endif
migration/migration.c
+4
-4
@@ -2203,7 +2203,7 @@ void migration_rp_kick(MigrationState *s)
2203
}
2204
2205
/* This is called only on destination side */
2206
-void migration_request_switchover_ack(const char *requester)
2206
+void migration_request_switchover_ack_legacy(const char *requester)
2207
{
2208
MigrationIncomingState *mis = migration_incoming_get_current();
2209
@@ -2211,10 +2211,10 @@ void migration_request_switchover_ack(const char *requester)
2211
return;
2212
}
2213
2214
- mis->switchover_ack_pending_num++;
2214
+ mis->switchover_ack_pending_num_legacy++;
2215
2216
- trace_migration_request_switchover_ack(requester,
2217
- mis->switchover_ack_pending_num);
2216
+ trace_migration_request_switchover_ack_legacy(
2217
+ requester, mis->switchover_ack_pending_num_legacy);
2218
}
2219
2220
static struct rp_cmd_args {
migration/migration.h
+1
-1
@@ -246,7 +246,7 @@ struct MigrationIncomingState {
246
* zero an ACK that it's OK to do switchover is sent to the source. No lock
247
* is needed as this field is updated serially.
248
*/
249
- unsigned int switchover_ack_pending_num;
249
+ unsigned int switchover_ack_pending_num_legacy;
250
251
/* Do exit on incoming migration failure */
252
bool exit_on_error;
migration/savevm.c
+33
-16
@@ -2478,6 +2478,31 @@ static int loadvm_postcopy_handle_switchover_start(Error **errp)
2478
return 0;
2479
}
2480
2481
+/*
2482
+ * If legacy switchover-ack is enabled but no device uses it, need to send an
2483
+ * ACK to source that it's OK to switchover.
2484
+ */
2485
+static int loadvm_switchover_ack_no_users_legacy(MigrationIncomingState *mis,
2486
+ Error **errp)
2487
+{
2488
+ int ret;
2489
+
2490
+ if (!migrate_switchover_ack()) {
2491
+ return 0;
2492
+ }
2493
+
2494
+ if (!mis->switchover_ack_pending_num_legacy) {
2495
+ ret = migrate_send_rp_switchover_ack(mis);
2496
+ if (ret) {
2497
+ error_setg_errno(errp, -ret,
2498
+ "Could not send switchover ack RP MSG");
2499
+ return ret;
2500
+ }
2501
+ }
2502
+
2503
+ return 0;
2504
+}
2505
+
2506
/*
2507
* Process an incoming 'QEMU_VM_COMMAND'
2508
* 0 just a normal return
@@ -2527,18 +2552,9 @@ static int loadvm_process_command(QEMUFile *f, Error **errp)
2552
}
2553
mis->to_src_file = qemu_file_get_return_path(f);
2554
2530
- /*
2531
- * Switchover ack is enabled but no device uses it, so send an ACK to
2532
- * source that it's OK to switchover. Do it here, after return path has
2533
- * been created.
2534
- */
2535
- if (migrate_switchover_ack() && !mis->switchover_ack_pending_num) {
2536
- ret = migrate_send_rp_switchover_ack(mis);
2537
- if (ret) {
2538
- error_setg_errno(errp, -ret,
2539
- "Could not send switchover ack RP MSG");
2540
- return ret;
2541
- }
2555
+ ret = loadvm_switchover_ack_no_users_legacy(mis, errp);
2556
+ if (ret) {
2557
+ return ret;
2558
}
2559
return 0;
2560
@@ -3157,14 +3173,15 @@ int qemu_loadvm_approve_switchover(const char *approver)
3173
{
3174
MigrationIncomingState *mis = migration_incoming_get_current();
3175
3160
- if (!mis->switchover_ack_pending_num) {
3176
+ if (!mis->switchover_ack_pending_num_legacy) {
3177
return -EINVAL;
3178
}
3179
3164
- mis->switchover_ack_pending_num--;
3165
- trace_loadvm_approve_switchover(approver, mis->switchover_ack_pending_num);
3180
+ mis->switchover_ack_pending_num_legacy--;
3181
+ trace_loadvm_approve_switchover_legacy(
3182
+ approver, mis->switchover_ack_pending_num_legacy);
3183
3167
- if (mis->switchover_ack_pending_num) {
3184
+ if (mis->switchover_ack_pending_num_legacy) {
3185
return 0;
3186
}
3187
migration/trace-events
+2
-2
@@ -23,7 +23,7 @@ loadvm_postcopy_ram_handle_discard_end(void) ""
23
loadvm_postcopy_ram_handle_discard_header(const char *ramid, uint16_t len) "%s: %ud"
24
loadvm_process_command(const char *s, uint16_t len) "com=%s len=%d"
25
loadvm_process_command_ping(uint32_t val) "0x%x"
26
-loadvm_approve_switchover(const char *approver, unsigned int switchover_ack_pending_num) "Approver %s, switchover_ack_pending_num %u"
26
+loadvm_approve_switchover_legacy(const char *approver, unsigned int switchover_ack_pending_num_legacy) "Approver %s, switchover_ack_pending_num_legacy %u"
27
postcopy_ram_listen_thread_exit(void) ""
28
postcopy_ram_listen_thread_start(void) ""
29
qemu_savevm_send_postcopy_advise(void) ""
@@ -198,7 +198,7 @@ process_incoming_migration_co_postcopy_end_main(void) ""
198
postcopy_preempt_enabled(bool value) "%d"
199
migration_precopy_complete(void) ""
200
migration_call_notifiers(int type) "type=%d"
201
-migration_request_switchover_ack(const char *requester, unsigned int switchover_ack_pending_num) "Requester %s, switchover_ack_pending_num %u"
201
+migration_request_switchover_ack_legacy(const char *requester, unsigned int switchover_ack_pending_num_legacy) "Requester %s, switchover_ack_pending_num_legacy %u"
202
203
# migration-stats
204
migration_transferred_bytes(uint64_t qemu_file, uint64_t multifd, uint64_t rdma) "qemu_file %" PRIu64 " multifd %" PRIu64 " RDMA %" PRIu64