We can know if VM in destination should go into COLO mode by refer to the info that has been migrated from PVM.
Signed-off-by: zhanghailiang <zhang.zhanghaili...@huawei.com> Signed-off-by: Yang Hongyang <yan...@cn.fujitsu.com> Signed-off-by: Lai Jiangshan <la...@cn.fujitsu.com> Signed-off-by: Gonglei <arei.gong...@huawei.com> --- include/migration/migration-colo.h | 2 ++ migration/Makefile.objs | 1 + migration/colo-comm.c | 55 ++++++++++++++++++++++++++++++++++++++ vl.c | 5 +++- 4 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 migration/colo-comm.c diff --git a/include/migration/migration-colo.h b/include/migration/migration-colo.h index 6fdbb94..de68c72 100644 --- a/include/migration/migration-colo.h +++ b/include/migration/migration-colo.h @@ -14,7 +14,9 @@ #define QEMU_MIGRATION_COLO_H #include "qemu-common.h" +#include "migration/migration.h" bool colo_supported(void); +void colo_info_mig_init(void); #endif diff --git a/migration/Makefile.objs b/migration/Makefile.objs index 5a25d39..cb7bd30 100644 --- a/migration/Makefile.objs +++ b/migration/Makefile.objs @@ -1,5 +1,6 @@ common-obj-y += migration.o tcp.o common-obj-$(CONFIG_COLO) += colo.o +common-obj-y += colo-comm.o common-obj-y += vmstate.o common-obj-y += qemu-file.o qemu-file-buf.o qemu-file-unix.o qemu-file-stdio.o common-obj-y += xbzrle.o diff --git a/migration/colo-comm.c b/migration/colo-comm.c new file mode 100644 index 0000000..cab97e9 --- /dev/null +++ b/migration/colo-comm.c @@ -0,0 +1,55 @@ +/* + * COarse-grain LOck-stepping Virtual Machines for Non-stop Service (COLO) + * (a.k.a. Fault Tolerance or Continuous Replication) + * + * Copyright (c) 2015 HUAWEI TECHNOLOGIES CO.,LTD. + * Copyright (c) 2015 FUJITSU LIMITED + * Copyright (c) 2015 Intel Corporation + * + * This work is licensed under the terms of the GNU GPL, version 2 or + * later. See the COPYING file in the top-level directory. + * + */ + +#include <migration/migration-colo.h> + +#define DEBUG_COLO_COMMON 0 + +#define DPRINTF(fmt, ...) \ + do { \ + if (DEBUG_COLO_COMMON) { \ + fprintf(stderr, "COLO: " fmt, ## __VA_ARGS__); \ + } \ + } while (0) + +static bool colo_requested; + +/* save */ +static void colo_info_save(QEMUFile *f, void *opaque) +{ + qemu_put_byte(f, migrate_enable_colo()); +} + +/* restore */ +static int colo_info_load(QEMUFile *f, void *opaque, int version_id) +{ + int value = qemu_get_byte(f); + + if (value && !colo_requested) { + DPRINTF("COLO requested!\n"); + } + colo_requested = value; + + return 0; +} + +static SaveVMHandlers savevm_colo_info_handlers = { + .save_state = colo_info_save, + .load_state = colo_info_load, +}; + +void colo_info_mig_init(void) +{ + register_savevm_live(NULL, "colo", -1, 1, + &savevm_colo_info_handlers, NULL); +} diff --git a/vl.c b/vl.c index 75ec292..9724992 100644 --- a/vl.c +++ b/vl.c @@ -90,6 +90,7 @@ int main(int argc, char **argv) #include "sysemu/dma.h" #include "audio/audio.h" #include "migration/migration.h" +#include "migration/migration-colo.h" #include "sysemu/kvm.h" #include "qapi/qmp/qjson.h" #include "qemu/option.h" @@ -4149,7 +4150,9 @@ int main(int argc, char **argv, char **envp) blk_mig_init(); ram_mig_init(); - +#ifdef CONFIG_COLO + colo_info_mig_init(); +#endif /* If the currently selected machine wishes to override the units-per-bus * property of its default HBA interface type, do so now. */ if (machine_class->units_per_default_bus) { -- 1.7.12.4