This is the multifd save prototype in its first semi-functional state, now with both save and restore minimally functional. Still as mentioned before, likely there are quite a few rough edges, let me know what you think about this possible option. changes from v2 are many, mainly: * added ability to restore the VM from disk using multifd * fixed the multifd-helper to work in both directions, assuming the need to listen for save, and connect for restore. * fixed a large number of bugs, and probably introduced some :-) KNOWN ISSUES: 1) this applies only to virsh save and virsh restore for now (no managed save etc). 2) the .pl scripts to generate the headers for the new APIs do not reliably work for me, for the Restore case. I get: src/remote/remote_daemon_dispatch_stubs.h:10080:9: error: too few arguments to function ‘virDomainRestoreParametersFlags’ if (virDomainRestoreParametersFlags(params, nparams, args->flags) < 0) To work around this I had to fixup the header manually to look like: ...(conn, params, nparams, args->flags) < 0) Thanks for your thoughts, Claudio Claudio Fontana (19): iohelper: introduce new struct to carry copy operation parameters iohelper: refactor copy operation as a separate function libvirt: introduce virDomainSaveParametersFlags public API libvirt: introduce virDomainRestoreParametersFlags public API remote: Add RPC support for the virDomainSaveParametersFlags API remote: Add RPC support for the virDomainRestoreParametersFlags API qemu: add a stub for virDomainSaveParametersFlags API qemu: add a stub for virDomainRestoreParametersFlags API qemu: saveimage: introduce virQEMUSaveFd iohelper: move runIO function to a separate module runio: add arguments to extend use beyond just stdin and stdout multifd-helper: new helper for parallel save/restore qemu: wire up saveimage code with the multifd helper qemu: implement qemuMigrationSrcToFilesMultiFd qemu: add parameter to qemuMigrationDstRun to skip waiting qemu: implement qemuSaveImageLoadMultiFd tools: add parallel parameter to virsh save command tools: add parallel parameter to virsh restore command qemu: add migration parameter multifd-compression docs/manpages/virsh.rst | 34 ++- include/libvirt/libvirt-domain.h | 13 + src/driver-hypervisor.h | 14 + src/libvirt-domain.c | 99 +++++++ src/libvirt_private.syms | 1 + src/libvirt_public.syms | 6 + src/qemu/qemu_capabilities.c | 5 + src/qemu/qemu_capabilities.h | 3 + src/qemu/qemu_driver.c | 233 +++++++++++---- src/qemu/qemu_migration.c | 155 ++++++---- src/qemu/qemu_migration.h | 16 +- src/qemu/qemu_migration_params.c | 71 +++-- src/qemu/qemu_migration_params.h | 15 + src/qemu/qemu_process.c | 3 +- src/qemu/qemu_process.h | 5 +- src/qemu/qemu_saveimage.c | 480 ++++++++++++++++++++++++------- src/qemu/qemu_saveimage.h | 49 +++- src/qemu/qemu_snapshot.c | 6 +- src/remote/remote_driver.c | 2 + src/remote/remote_protocol.x | 29 +- src/remote_protocol-structs | 17 ++ src/util/iohelper.c | 150 +--------- src/util/meson.build | 15 + src/util/multifd-helper.c | 250 ++++++++++++++++ src/util/runio.c | 214 ++++++++++++++ src/util/runio.h | 38 +++ src/util/virthread.c | 5 + src/util/virthread.h | 1 + tools/virsh-domain.c | 96 +++++-- 29 files changed, 1599 insertions(+), 426 deletions(-) create mode 100644 src/util/multifd-helper.c create mode 100644 src/util/runio.c create mode 100644 src/util/runio.h -- 2.34.1