xemu/migration
Leonardo Bras b7dbdd8e76 multifd: Send header packet without flags if zero-copy-send is enabled
Since d48c3a0445 ("multifd: Use a single writev on the send side"),
sending the header packet and the memory pages happens in the same
writev, which can potentially make the migration faster.

Using channel-socket as example, this works well with the default copying
mechanism of sendmsg(), but with zero-copy-send=true, it will cause
the migration to often break.

This happens because the header packet buffer gets reused quite often,
and there is a high chance that by the time the MSG_ZEROCOPY mechanism get
to send the buffer, it has already changed, sending the wrong data and
causing the migration to abort.

It means that, as it is, the buffer for the header packet is not suitable
for sending with MSG_ZEROCOPY.

In order to enable zero copy for multifd, send the header packet on an
individual write(), without any flags, and the remanining pages with a
writev(), as it was happening before. This only changes how a migration
with zero-copy-send=true works, not changing any current behavior for
migrations with zero-copy-send=false.

Signed-off-by: Leonardo Bras <leobras@redhat.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Message-Id: <20220513062836.965425-8-leobras@redhat.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
2022-05-16 13:56:24 +01:00
..
block-dirty-bitmap.c migration: block-dirty-bitmap: add missing qemu_mutex_lock_iothread 2021-10-05 13:10:29 +02:00
block.c block: rename bdrv_invalidate_cache_all, blk_invalidate_cache and test_sync_op_invalidate_cache 2022-03-04 18:14:40 +01:00
block.h migration: disable auto-converge during bulk block migration 2017-09-27 11:27:14 +01:00
channel.c migration: Add migrate_use_tls() helper 2022-05-16 13:56:24 +01:00
channel.h migration: Route errors down through migration_channel_connect 2018-02-06 10:55:12 +00:00
colo-failover.c qemu/atomic.h: rename atomic_ to qatomic_ 2020-09-23 16:07:44 +01:00
colo.c COLO: Move some trace code behind qemu_mutex_unlock_iothread() 2021-12-15 10:31:42 +01:00
dirtyrate.c Use g_new() & friends where that makes obvious sense 2022-03-21 15:44:44 +01:00
dirtyrate.h migration/dirtyrate: introduce struct and adjust DirtyRateStat 2021-11-01 22:56:43 +01:00
exec.c migration: unify incoming processing 2018-07-10 12:48:53 +01:00
exec.h migration: Export exec.c functions in its own file 2017-06-01 18:49:22 +02:00
fd.c monitor: Use getter/setter functions for cur_mon 2020-10-09 07:08:19 +02:00
fd.h migration: Fix fd protocol for incoming defer 2019-06-05 12:43:55 +02:00
global_state.c migration: Silence compiler warning in global_state_store_running() 2020-10-02 12:28:48 +01:00
meson.build meson, configure: move RDMA options to meson 2022-04-28 08:52:20 +02:00
migration.c migration: Add migrate_use_tls() helper 2022-05-16 13:56:24 +01:00
migration.h migration: Add migrate_use_tls() helper 2022-05-16 13:56:24 +01:00
multifd-zlib.c Use g_new() & friends where that makes obvious sense 2022-03-21 15:44:44 +01:00
multifd-zstd.c multifd: recv side only needs the RAMBlock host address 2022-01-28 15:38:23 +01:00
multifd.c multifd: Send header packet without flags if zero-copy-send is enabled 2022-05-16 13:56:24 +01:00
multifd.h multifd: multifd_send_sync_main now returns negative on error 2022-05-16 13:56:24 +01: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 Replace qemu_real_host_page variables with inlined functions 2022-04-06 10:50:38 +02:00
postcopy-ram.h migration: Add postcopy_thread_create() 2022-03-02 18:20:45 +00:00
qemu-file-channel.c migration: Move the yank unregister of channel_close out 2021-07-26 12:45:03 +01:00
qemu-file-channel.h migration: Export qemu-file-channel.c functions in its own file 2017-05-18 19:20:50 +02:00
qemu-file.c include: Move qemu_madvise() and related #defines to new qemu/madvise.h 2022-02-21 13:30:20 +00:00
qemu-file.h migration: Teach QEMUFile to be QIOChannel-aware 2021-07-26 12:44:59 +01:00
ram.c multifd: multifd_send_sync_main now returns negative on error 2022-05-16 13:56:24 +01:00
ram.h migration: Export ram_load_postcopy() 2022-04-21 19:36:46 +01:00
rdma.c QIOChannel: Add flags on io_writev and introduce io_flush callback 2022-05-16 13:56:24 +01:00
rdma.h migration: Export rdma.c functions in its own file 2017-06-01 18:49:23 +02:00
savevm.c migration: Allow migrate-recover to run multiple times 2022-04-21 19:36:46 +01:00
savevm.h migration: Add blocker information 2021-02-08 11:19:51 +00:00
socket.c migration: Add zero-copy-send parameter for QMP/HMP for Linux 2022-05-16 13:56:24 +01:00
socket.h migration: unify the framework of socket-type channel 2020-08-28 13:34:52 +01:00
target.c migration: Move populate_vfio_info() into a separate file 2021-05-14 12:31:51 +02:00
tls.c migration: fix use of TLS PSK credentials with a UNIX socket 2022-04-21 19:36:46 +01:00
tls.h migration: Fix Lesser GPL version number 2020-11-15 16:43:28 +01:00
trace-events migration: Tracepoint change in postcopy-run bottom half 2022-03-02 18:17:56 +00:00
trace.h trace: switch position of headers to what Meson requires 2020-08-21 06:18:24 -04:00
vmstate-types.c Move CPU softfloat unions to cpu-float.h 2022-04-06 14:31:43 +02:00
vmstate.c migration: Remove load_state_old and minimum_version_id_old 2022-03-02 18:20:45 +00:00
xbzrle.c migration: Create migration/xbzrle.h 2017-05-18 18:04:54 +02:00
xbzrle.h migration: Create migration/xbzrle.h 2017-05-18 18:04:54 +02:00
yank_functions.c migration: Move the yank unregister of channel_close out 2021-07-26 12:45:03 +01:00
yank_functions.h migration: Move the yank unregister of channel_close out 2021-07-26 12:45:03 +01:00