qemu/migration
Peter Xu 20d8262281 migration/postcopy: Spatial locality page hint for preempt mode
The preempt mode postcopy has been introduced for a while.  From latency
POV, it should always win the vanilla postcopy.

However there's one thing missing when preempt mode is enabled right now,
which is the spatial locality hint when there're page requests from the
destination side.

In vanilla postcopy, as long as a page request was unqueued, it will update
the PSS of the precopy background stream, so that after a page request the
background thread will move the pages after whatever was requested.  It's
pretty much a natural behavior when there's only one channel anyway, and
one scanner to send the pages.

Preempt mode didn't follow that, because preempt mode has its own channel
and its own PSS (which doesn't linearly scan the guest memory, but
dedicated to resolve page requested from destination).  So the page request
process and the background migration process are completely separate.

This patch adds the hint explicitly for preempt mode.  With that, whenever
the preempt mode receives a page request on the source, it will service the
remote page fault in the return path, then it'll provide a hint to the
background thread so that we'll start sending the pages right after the
requested ones in the background, assuming the follow up pages have a
higher chance to be accessed later.

NOTE: since the background migration thread and return path thread run
completely concurrently, it doesn't always mean the hint will be applied
every single time.  For example, it's possible that the return path thread
receives multiple page requests in a row without the background thread
getting the chance to consume one.  In such case, the preempt thread only
provide the hint if the previous hint has been consumed.  After all,
there's no point queuing hints when we only have one linear scanner.

This could measureably improve the simple sequential memory access pattern
during postcopy (when preempt is on).  For random accesses, I can measure a
slight increase of remote page fault latency from ~500us -> ~600us, that
could be a trade-off to have such hint mechanism, and after all that's
still greatly improved comparing to vanilla postcopy on random (~10ms).

The patch is verified by our QE team in a video streaming test case, to
reduce the pause of the video from ~1min to a few seconds when switching
over to postcopy with preempt mode.

Reported-by: Xiaohui Li <xiaohli@redhat.com>
Tested-by: Xiaohui Li <xiaohli@redhat.com>
Reviewed-by: Juraj Marcin <jmarcin@redhat.com>
Link: https://lore.kernel.org/r/20250424220705.195544-1-peterx@redhat.com
Signed-off-by: Peter Xu <peterx@redhat.com>
2025-05-02 11:09:36 -04:00
..
block-active.c migration/block-active: Remove global active flag 2025-02-06 14:26:51 +01:00
block-dirty-bitmap.c include: Rename sysemu/ -> system/ 2024-12-20 17:44:56 +01:00
channel-block.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
channel-block.h migration: introduce a QIOChannel impl for BlockDriverState VMState 2022-06-22 19:33:43 +01:00
channel.c migration: Fix hang after error in destination setup phase 2025-02-14 15:19:05 -03:00
channel.h migration: check magic value for deciding the mapping of channels 2023-02-06 19:22:57 +01:00
colo-failover.c migration/colo: Improve an x-colo-lost-heartbeat error message 2023-02-23 14:10:17 +01:00
colo-stubs.c migration/colo: make colo_incoming_co() return void 2024-05-22 17:34:31 -03:00
colo.c migration: Add MIG_CMD_SWITCHOVER_START and its load handler 2025-03-06 06:47:33 +01:00
cpr-transfer.c migration: cpr-transfer save and load 2025-01-29 11:43:05 -03:00
cpr.c migration: cpr_is_incoming 2025-03-14 09:29:19 -03:00
cpu-throttle.c include: Rename sysemu/ -> system/ 2024-12-20 17:44:56 +01:00
dirtyrate.c include/system: Move exec/ramblock.h to system/ramblock.h 2025-04-23 14:08:26 -07:00
dirtyrate.h include: Rename sysemu/ -> system/ 2024-12-20 17:44:56 +01:00
exec.c migration: simplify exec migration functions 2024-03-04 07:12:40 +01:00
exec.h migration: convert exec backend to accept MigrateAddress. 2023-11-02 11:35:04 +01:00
fd.c migration: Allow pipes to keep working for fd migrations 2024-11-25 16:21:55 -05:00
fd.h migration: Revert mapped-ram multifd support to fd: URI 2024-03-22 12:12:08 -04:00
file.c include/system: Move exec/ramblock.h to system/ramblock.h 2025-04-23 14:08:26 -07:00
file.h migration/multifd: Pass in MultiFDPages_t to file_write_ramblock_iov 2024-09-03 16:24:35 -03:00
global_state.c include: Rename sysemu/ -> system/ 2024-12-20 17:44:56 +01:00
meson.build migration/multifd: Device state transfer support - send side 2025-03-06 06:47:33 +01:00
migration-hmp-cmds.c migration: Add MIG_CMD_SWITCHOVER_START and its load handler 2025-03-06 06:47:33 +01:00
migration-stats.c migration: migration_rate_limit_reset() don't need the QEMUFile 2023-10-31 08:44:33 +01:00
migration-stats.h migration: Remove transferred atomic counter 2023-10-31 08:44:33 +01:00
migration.c migration: Add save_postcopy_prepare() savevm handler 2025-05-02 11:09:36 -04:00
migration.h migration: Add thread pool of optional load threads 2025-03-06 06:47:33 +01:00
multifd-device-state.c migration: Add save_live_complete_precopy_thread handler 2025-03-06 06:47:33 +01:00
multifd-nocomp.c Miscellaneous patches for 2025-04-24 2025-04-24 13:44:57 -04:00
multifd-qatzip.c include/system: Move exec/ramblock.h to system/ramblock.h 2025-04-23 14:08:26 -07:00
multifd-qpl.c include/system: Move exec/ramblock.h to system/ramblock.h 2025-04-23 14:08:26 -07:00
multifd-uadk.c include/system: Move exec/ramblock.h to system/ramblock.h 2025-04-23 14:08:26 -07:00
multifd-zero-page.c include/system: Move exec/ramblock.h to system/ramblock.h 2025-04-23 14:08:26 -07:00
multifd-zlib.c include/system: Move exec/ramblock.h to system/ramblock.h 2025-04-23 14:08:26 -07:00
multifd-zstd.c include/system: Move exec/ramblock.h to system/ramblock.h 2025-04-23 14:08:26 -07:00
multifd.c migration/multifd: move macros to multifd header 2025-05-02 11:09:36 -04:00
multifd.h migration/multifd: move macros to multifd header 2025-05-02 11:09:36 -04:00
options.c migration: Fix latent bug in migrate_params_test_apply() 2025-05-02 11:09:36 -04:00
options.h migration: check RDMA and capabilities are compatible on both sides 2025-05-02 11:09:36 -04:00
page_cache.c migration: Fix cache_init()'s "Failed to allocate" error messages 2021-02-08 11:19:51 +00:00
page_cache.h migration: Clean up signed vs. unsigned XBZRLE cache-size 2021-02-08 11:19:51 +00:00
postcopy-ram.c include/system: Move exec/ramblock.h to system/ramblock.h 2025-04-23 14:08:26 -07:00
postcopy-ram.h migration/postcopy: Add postcopy-recover-setup phase 2024-06-21 09:47:59 -03:00
qemu-file.c cleanup: Drop pointless return at end of function 2025-04-24 09:33:42 +02:00
qemu-file.h migration/qemu-file: Define g_autoptr() cleanup function for QEMUFile 2025-03-06 06:47:34 +01:00
ram.c migration/postcopy: Spatial locality page hint for preempt mode 2025-05-02 11:09:36 -04:00
ram.h migration/ram: Move RAM_SAVE_FLAG* into ram.h 2025-01-09 17:38:15 -03:00
rdma.c migration: Unfold control_save_page() 2025-05-02 11:09:36 -04:00
rdma.h migration: Unfold control_save_page() 2025-05-02 11:09:36 -04:00
savevm.c migration: Add save_postcopy_prepare() savevm handler 2025-05-02 11:09:36 -04:00
savevm.h migration: Add save_postcopy_prepare() savevm handler 2025-05-02 11:09:36 -04:00
socket.c migration: Remove unused socket_send_channel_create_sync 2024-10-08 15:28:55 -04:00
socket.h migration: Remove unused socket_send_channel_create_sync 2024-10-08 15:28:55 -04:00
target.c vfio: Introduce a new header file for external migration services 2025-04-25 09:01:37 +02:00
threadinfo.c migration/multifd: Protect accesses to migration_threads 2023-07-26 10:55:56 +02:00
threadinfo.h migration/multifd: Protect accesses to migration_threads 2023-07-26 10:55:56 +02:00
tls.c migration/multifd: Terminate the TLS connection 2025-02-14 15:19:04 -03:00
tls.h migration/multifd: Terminate the TLS connection 2025-02-14 15:19:04 -03:00
trace-events migration: Add MIG_CMD_SWITCHOVER_START and its load handler 2025-03-06 06:47:33 +01:00
trace.h trace: switch position of headers to what Meson requires 2020-08-21 06:18:24 -04:00
vmstate-types.c migration: cpr-transfer mode 2025-01-29 11:56:24 -03:00
vmstate.c qapi: Move include/qapi/qmp/ to include/qobject/ 2025-02-10 15:33:16 +01:00
xbzrle.c migration/xbzrle: Use i386 host/cpuinfo.h 2023-05-23 16:51:18 -07:00
xbzrle.h migration/xbzrle: Use i386 host/cpuinfo.h 2023-05-23 16:51:18 -07:00
yank_functions.c migration/yank: Use channel features 2024-01-29 11:02:12 +08:00
yank_functions.h migration: Move the yank unregister of channel_close out 2021-07-26 12:45:03 +01:00