@@ -35,6 +35,7 @@
#define QEMU_VM_VMDESCRIPTION 0x06
#define QEMU_VM_CONFIGURATION 0x07
#define QEMU_VM_COMMAND 0x08
+#define QEMU_VM_SECTION_HEADER 0x09
#define QEMU_VM_SECTION_FOOTER 0x7e
struct MigrationParams {
@@ -677,7 +677,8 @@ void savevm_skip_section_footers(void)
}
/*
- * Write the header for device section (QEMU_VM_SECTION START/END/PART/FULL)
+ * Write the header for device section
+ * (QEMU_VM_SECTION START/END/PART/FULL/HEADER)
*/
static void save_section_header(QEMUFile *f, SaveStateEntry *se,
uint8_t section_type)
@@ -686,7 +687,8 @@ static void save_section_header(QEMUFile *f, SaveStateEntry *se,
qemu_put_be32(f, se->section_id);
if (section_type == QEMU_VM_SECTION_FULL ||
- section_type == QEMU_VM_SECTION_START) {
+ section_type == QEMU_VM_SECTION_START ||
+ section_type == QEMU_VM_SECTION_HEADER) {
/* ID string */
size_t len = strlen(se->idstr);
qemu_put_byte(f, len);
@@ -887,6 +889,10 @@ void qemu_savevm_state_begin(QEMUFile *f,
trace_savevm_state_begin();
QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
+ /* new section type since 2.8, we send devices header to destination
+ * at the migration beginning
+ */
+ save_section_header(f, se, QEMU_VM_SECTION_HEADER);
if (!se->ops || !se->ops->set_params) {
continue;
}
@@ -1846,11 +1852,20 @@ static int qemu_loadvm_state_main(QEMUFile *f, MigrationIncomingState *mis)
{
uint8_t section_type;
int ret;
+ uint32_t vid, sid;
+ SaveStateEntry *se;
while ((section_type = qemu_get_byte(f)) != QEMU_VM_EOF) {
trace_qemu_loadvm_state_section(section_type);
switch (section_type) {
+ /* new section type since 2.8 */
+ case QEMU_VM_SECTION_HEADER:
+ ret = qemu_loadvm_section_header(f, mis, &se, &vid, &sid);
+ if (ret < 0) {
+ return ret;
+ }
+ break;
case QEMU_VM_SECTION_START:
case QEMU_VM_SECTION_FULL:
ret = qemu_loadvm_section_start_full(f, mis);
Introduce a new section type to help destination to detect unknown/inconsistent devices early that let source side stop migration and keep alive. Prevoisly, if we have a different device list between source and distination ( e.g: souce with -device virtio-blk,drive=foo and distination with -device virtio-scsi-pci,id=scsi0), after migration, the source goto status "paused (postmigrate)" and distination will exit since detect inconsistent device. Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com> --- include/migration/migration.h | 1 + migration/savevm.c | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-)