* Yang Hongyang (yanghy@xxxxxxxxxxxxxx) wrote: > migrate colo info to migration target to tell the target colo is > enabled. If I understand this correctly this means that you send a 'colo info' device information for migrations that don't have COLO enabled; that's bad because it breaks migration unless the destination has it; I guess it's OK if you were to guard it with a thing so it didn't do it for old machine-types. You could use the QEMU_VM_COMMAND sections I've created for postcopy; ( http://lists.gnu.org/archive/html/qemu-devel/2014-07/msg00889.html ) and add a QEMU_VM_CMD_COLO to indicate you want the destination to become an SVM, then check the capability near the start of migration and send the command. Or perhaps there's a way to add the colo-info device on the command line so it's not always there. Dave > Signed-off-by: Yang Hongyang <yanghy@xxxxxxxxxxxxxx> > --- > Makefile.objs | 1 + > include/migration/migration-colo.h | 3 ++ > migration-colo-comm.c | 68 ++++++++++++++++++++++++++++++++++++++ > vl.c | 4 +++ > 4 files changed, 76 insertions(+) > create mode 100644 migration-colo-comm.c > > diff --git a/Makefile.objs b/Makefile.objs > index cab5824..1836a68 100644 > --- a/Makefile.objs > +++ b/Makefile.objs > @@ -50,6 +50,7 @@ common-obj-$(CONFIG_POSIX) += os-posix.o > common-obj-$(CONFIG_LINUX) += fsdev/ > > common-obj-y += migration.o migration-tcp.o > +common-obj-y += migration-colo-comm.o > common-obj-$(CONFIG_COLO) += migration-colo.o > common-obj-y += vmstate.o > common-obj-y += qemu-file.o > diff --git a/include/migration/migration-colo.h b/include/migration/migration-colo.h > index 35b384c..e3735d8 100644 > --- a/include/migration/migration-colo.h > +++ b/include/migration/migration-colo.h > @@ -12,6 +12,9 @@ > #define QEMU_MIGRATION_COLO_H > > #include "qemu-common.h" > +#include "migration/migration.h" > + > +void colo_info_mig_init(void); > > bool colo_supported(void); > > diff --git a/migration-colo-comm.c b/migration-colo-comm.c > new file mode 100644 > index 0000000..ccbc246 > --- /dev/null > +++ b/migration-colo-comm.c > @@ -0,0 +1,68 @@ > +/* > + * COarse-grain LOck-stepping Virtual Machines for Non-stop Service (COLO) > + * (a.k.a. Fault Tolerance or Continuous Replication) > + * > + * Copyright (C) 2014 FUJITSU LIMITED > + * > + * 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 > + > +#ifdef DEBUG_COLO > +#define DPRINTF(fmt, ...) \ > + do { fprintf(stdout, "COLO: " fmt, ## __VA_ARGS__); } while (0) > +#else > +#define DPRINTF(fmt, ...) \ > + do { } while (0) > +#endif > + > +static bool colo_requested; > + > +/* save */ > + > +static bool migrate_use_colo(void) > +{ > + MigrationState *s = migrate_get_current(); > + return s->enabled_capabilities[MIGRATION_CAPABILITY_COLO]; > +} > + > +static void colo_info_save(QEMUFile *f, void *opaque) > +{ > + qemu_put_byte(f, migrate_use_colo()); > +} > + > +/* restore */ > + > +static int colo_info_load(QEMUFile *f, void *opaque, int version_id) > +{ > + int value = qemu_get_byte(f); > + > + if (value && !colo_supported()) { > + fprintf(stderr, "COLO is not supported\n"); > + return -EINVAL; > + } > + > + 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 info", -1, 1, > + &savevm_colo_info_handlers, NULL); > +} > diff --git a/vl.c b/vl.c > index fe451aa..1a282d8 100644 > --- a/vl.c > +++ b/vl.c > @@ -89,6 +89,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" > @@ -4339,6 +4340,9 @@ int main(int argc, char **argv, char **envp) > > blk_mig_init(); > ram_mig_init(); > + if (colo_supported()) { > + colo_info_mig_init(); > + } > > /* open the virtual block devices */ > if (snapshot) > -- > 1.9.1 > -- Dr. David Alan Gilbert / dgilbert@xxxxxxxxxx / Manchester, UK -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html