This series is a larger rework of the block migration support qemu recently gained. Besides lots of code refactorings the major changes are: - Faster restore due to larger block sizes (even if the target disk is unallocated) - Off-by-one fixes in the block dirty tracking code - Allow for multiple migrations (after cancellation or if migrating into a backup image) - Proper error handling - Progress reporting fixes: report to monitor instead of stdout, report sum of multiple disks - Report disk migration progress via 'info migrate' - Progress report during restore
One patch is directly taken from Pierre Riteau queue [1] who happend to work on the some topic the last days, two more are derived from his commits. These patches make block migration usable for us. Still, there are two more major improvements on my wish/todo list: - Respect specified maximum migration downtime (will require tracking of the number of dirty blocks + some coordination with ram migration) - Do not transfere unallocated disk space (also for raw images, ie. add bdrv_is_allocated support for the latter) In an off-list chat, Liran additionally brought up the topic that RAM migration should not start too early so that we avoid re-transmitting dirty pages over and over again while the disk image is slowly beamed over. I hope we can join our efforts to resolve the open topics quickly, the critical ones ideally before the merge window closes. Find the patches also at git://git.kiszka.org/qemu.git queues/migration Jan Kiszka (22): migration: Fix use of file after release migration: Catch multiple start commands block migration: Fix coding style and whitespaces block migration: Rework constants API block migration: Cleanup dirty tracking code block migration: Avoid large stack buffer block migration: Avoid indirection of block_mig_state block migration: Drop dead code block migration: Switch device and block lists to QSIMPLEQ block migration: Initialize remaining BlkMigState fields block migration: Clean up use of total_sectors block migration: Consolidate mig_read_device_bulk into mig_save_device_bulk block migration: Consolidate block transmission block migration: Add error handling/propagation ram migration: Stop loading on error live migration: Allow cleanup after cancellation or error block migration: Report overall migration progress live migration: Propagate output monitor to callback handler block migration: Fix outgoing progress output block migration: Report progress also via info migration block migration: Add support for restore progress reporting block migration: Increase dirty chunk size to 1M Pierre Riteau (1): Import a simple queue implementation from NetBSD block-migration.c | 737 ++++++++++++++++++++++++++--------------------------- block-migration.h | 16 +- block.c | 127 +++++----- block.h | 11 +- block_int.h | 3 +- hw/hw.h | 3 +- migration-exec.c | 12 +- migration-fd.c | 9 +- migration-tcp.c | 10 +- migration-unix.c | 10 +- migration.c | 52 +++-- migration.h | 13 +- qemu-queue.h | 109 ++++++++- savevm.c | 42 ++- sysemu.h | 9 +- vl.c | 13 +- 16 files changed, 653 insertions(+), 523 deletions(-) [1] http://github.com/priteau/qemu/commits/blkmig