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 | 47 ++++++++++++++++++++++++++++++++++++++ trace-events | 3 +++ vl.c | 5 +++- 5 files changed, 57 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 c6d0c51..e20a0c1 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..0b76eb4 --- /dev/null +++ b/migration/colo-comm.c @@ -0,0 +1,47 @@ +/* + * 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> +#include "trace.h" + +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) { + trace_colo_info_load("COLO request!"); + } + 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/trace-events b/trace-events index 11387c3..d927cf3 100644 --- a/trace-events +++ b/trace-events @@ -1443,6 +1443,9 @@ rdma_start_incoming_migration_after_rdma_listen(void) "" rdma_start_outgoing_migration_after_rdma_connect(void) "" rdma_start_outgoing_migration_after_rdma_source_init(void) "" +# migration/colo-comm.c +colo_info_load(const char *msg) "%s" + # kvm-all.c kvm_ioctl(int type, void *arg) "type 0x%x, arg %p" kvm_vm_ioctl(int type, void *arg) "type 0x%x, arg %p" diff --git a/vl.c b/vl.c index 15bccc4..c42cef3 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" @@ -4174,7 +4175,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