Message ID | 20180514165424.12884-7-zhangckid@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
* Zhang Chen (zhangckid@gmail.com) wrote: > We need to know if migration is going into COLO state for > incoming side before start normal migration. > > Instead by using the VMStateDescription to send colo_state > from source side to destination side, we use MIG_CMD_ENABLE_COLO > to indicate whether COLO is enabled or not. > > Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com> > Signed-off-by: Zhang Chen <zhangckid@gmail.com> Yes, that simplifies it a bit. Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> > --- > include/migration/colo.h | 5 +-- > migration/Makefile.objs | 2 +- > migration/colo-comm.c | 76 ---------------------------------------- > migration/colo.c | 13 ++++++- > migration/migration.c | 23 +++++++++++- > migration/savevm.c | 20 +++++++++++ > migration/savevm.h | 1 + > migration/trace-events | 1 + > vl.c | 2 -- > 9 files changed, 60 insertions(+), 83 deletions(-) > delete mode 100644 migration/colo-comm.c > > diff --git a/include/migration/colo.h b/include/migration/colo.h > index fefb2fcf4c..99ce17aca7 100644 > --- a/include/migration/colo.h > +++ b/include/migration/colo.h > @@ -28,8 +28,9 @@ void migrate_start_colo_process(MigrationState *s); > bool migration_in_colo_state(void); > > /* loadvm */ > -bool migration_incoming_enable_colo(void); > -void migration_incoming_exit_colo(void); > +void migration_incoming_enable_colo(void); > +void migration_incoming_disable_colo(void); > +bool migration_incoming_colo_enabled(void); > void *colo_process_incoming_thread(void *opaque); > bool migration_incoming_in_colo_state(void); > > diff --git a/migration/Makefile.objs b/migration/Makefile.objs > index c83ec47ba8..a4f3bafd86 100644 > --- a/migration/Makefile.objs > +++ b/migration/Makefile.objs > @@ -1,6 +1,6 @@ > common-obj-y += migration.o socket.o fd.o exec.o > common-obj-y += tls.o channel.o savevm.o > -common-obj-y += colo-comm.o colo.o colo-failover.o > +common-obj-y += colo.o colo-failover.o > common-obj-y += vmstate.o vmstate-types.o page_cache.o > common-obj-y += qemu-file.o global_state.o > common-obj-y += qemu-file-channel.o > diff --git a/migration/colo-comm.c b/migration/colo-comm.c > deleted file mode 100644 > index df26e4dfe7..0000000000 > --- a/migration/colo-comm.c > +++ /dev/null > @@ -1,76 +0,0 @@ > -/* > - * COarse-grain LOck-stepping Virtual Machines for Non-stop Service (COLO) > - * (a.k.a. Fault Tolerance or Continuous Replication) > - * > - * Copyright (c) 2016 HUAWEI TECHNOLOGIES CO., LTD. > - * Copyright (c) 2016 FUJITSU LIMITED > - * Copyright (c) 2016 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 "qemu/osdep.h" > -#include "migration.h" > -#include "migration/colo.h" > -#include "migration/vmstate.h" > -#include "trace.h" > - > -typedef struct { > - bool colo_requested; > -} COLOInfo; > - > -static COLOInfo colo_info; > - > -COLOMode get_colo_mode(void) > -{ > - if (migration_in_colo_state()) { > - return COLO_MODE_PRIMARY; > - } else if (migration_incoming_in_colo_state()) { > - return COLO_MODE_SECONDARY; > - } else { > - return COLO_MODE_UNKNOWN; > - } > -} > - > -static int colo_info_pre_save(void *opaque) > -{ > - COLOInfo *s = opaque; > - > - s->colo_requested = migrate_colo_enabled(); > - > - return 0; > -} > - > -static bool colo_info_need(void *opaque) > -{ > - return migrate_colo_enabled(); > -} > - > -static const VMStateDescription colo_state = { > - .name = "COLOState", > - .version_id = 1, > - .minimum_version_id = 1, > - .pre_save = colo_info_pre_save, > - .needed = colo_info_need, > - .fields = (VMStateField[]) { > - VMSTATE_BOOL(colo_requested, COLOInfo), > - VMSTATE_END_OF_LIST() > - }, > -}; > - > -void colo_info_init(void) > -{ > - vmstate_register(NULL, 0, &colo_state, &colo_info); > -} > - > -bool migration_incoming_enable_colo(void) > -{ > - return colo_info.colo_requested; > -} > - > -void migration_incoming_exit_colo(void) > -{ > - colo_info.colo_requested = false; > -} > diff --git a/migration/colo.c b/migration/colo.c > index e06640c3d6..c083d3696f 100644 > --- a/migration/colo.c > +++ b/migration/colo.c > @@ -152,6 +152,17 @@ static void primary_vm_do_failover(void) > qemu_sem_post(&s->colo_exit_sem); > } > > +COLOMode get_colo_mode(void) > +{ > + if (migration_in_colo_state()) { > + return COLO_MODE_PRIMARY; > + } else if (migration_incoming_in_colo_state()) { > + return COLO_MODE_SECONDARY; > + } else { > + return COLO_MODE_UNKNOWN; > + } > +} > + > void colo_do_failover(MigrationState *s) > { > /* Make sure VM stopped while failover happened. */ > @@ -745,7 +756,7 @@ out: > if (mis->to_src_file) { > qemu_fclose(mis->to_src_file); > } > - migration_incoming_exit_colo(); > + migration_incoming_disable_colo(); > > return NULL; > } > diff --git a/migration/migration.c b/migration/migration.c > index ddd0c4b988..8dee7dd309 100644 > --- a/migration/migration.c > +++ b/migration/migration.c > @@ -277,6 +277,22 @@ int migrate_send_rp_req_pages(MigrationIncomingState *mis, const char *rbname, > return migrate_send_rp_message(mis, msg_type, msglen, bufc); > } > > +static bool migration_colo_enabled; > +bool migration_incoming_colo_enabled(void) > +{ > + return migration_colo_enabled; > +} > + > +void migration_incoming_disable_colo(void) > +{ > + migration_colo_enabled = false; > +} > + > +void migration_incoming_enable_colo(void) > +{ > + migration_colo_enabled = true; > +} > + > void qemu_start_incoming_migration(const char *uri, Error **errp) > { > const char *p; > @@ -388,7 +404,7 @@ static void process_incoming_migration_co(void *opaque) > } > > /* we get COLO info, and know if we are in COLO mode */ > - if (!ret && migration_incoming_enable_colo()) { > + if (!ret && migration_incoming_colo_enabled()) { > /* Make sure all file formats flush their mutable metadata */ > bdrv_invalidate_cache_all(&local_err); > if (local_err) { > @@ -2431,6 +2447,11 @@ static void *migration_thread(void *opaque) > qemu_savevm_send_postcopy_advise(s->to_dst_file); > } > > + if (migrate_colo_enabled()) { > + /* Notify migration destination that we enable COLO */ > + qemu_savevm_send_colo_enable(s->to_dst_file); > + } > + > qemu_savevm_state_setup(s->to_dst_file); > > s->setup_time = qemu_clock_get_ms(QEMU_CLOCK_HOST) - setup_start; > diff --git a/migration/savevm.c b/migration/savevm.c > index e2be02afe4..c43d220220 100644 > --- a/migration/savevm.c > +++ b/migration/savevm.c > @@ -55,6 +55,8 @@ > #include "io/channel-buffer.h" > #include "io/channel-file.h" > #include "sysemu/replay.h" > +#include "migration/colo.h" > + > > #ifndef ETH_P_RARP > #define ETH_P_RARP 0x8035 > @@ -81,6 +83,9 @@ enum qemu_vm_cmd { > were previously sent during > precopy but are dirty. */ > MIG_CMD_PACKAGED, /* Send a wrapped stream within this stream */ > + > + MIG_CMD_ENABLE_COLO, /* Enable COLO */ > + > MIG_CMD_MAX > }; > > @@ -836,6 +841,12 @@ static void qemu_savevm_command_send(QEMUFile *f, > qemu_fflush(f); > } > > +void qemu_savevm_send_colo_enable(QEMUFile *f) > +{ > + trace_savevm_send_colo_enable(); > + qemu_savevm_command_send(f, MIG_CMD_ENABLE_COLO, 0, NULL); > +} > + > void qemu_savevm_send_ping(QEMUFile *f, uint32_t value) > { > uint32_t buf; > @@ -1793,6 +1804,12 @@ static int loadvm_handle_cmd_packaged(MigrationIncomingState *mis) > return ret; > } > > +static int loadvm_process_enable_colo(MigrationIncomingState *mis) > +{ > + migration_incoming_enable_colo(); > + return 0; > +} > + > /* > * Process an incoming 'QEMU_VM_COMMAND' > * 0 just a normal return > @@ -1866,6 +1883,9 @@ static int loadvm_process_command(QEMUFile *f) > > case MIG_CMD_POSTCOPY_RAM_DISCARD: > return loadvm_postcopy_ram_handle_discard(mis, len); > + > + case MIG_CMD_ENABLE_COLO: > + return loadvm_process_enable_colo(mis); > } > > return 0; > diff --git a/migration/savevm.h b/migration/savevm.h > index cf4f0d37ca..c6d46b37a2 100644 > --- a/migration/savevm.h > +++ b/migration/savevm.h > @@ -52,6 +52,7 @@ void qemu_savevm_send_postcopy_ram_discard(QEMUFile *f, const char *name, > uint16_t len, > uint64_t *start_list, > uint64_t *length_list); > +void qemu_savevm_send_colo_enable(QEMUFile *f); > > int qemu_loadvm_state(QEMUFile *f); > void qemu_loadvm_state_cleanup(void); > diff --git a/migration/trace-events b/migration/trace-events > index d6be74b7a7..9295b4cf40 100644 > --- a/migration/trace-events > +++ b/migration/trace-events > @@ -34,6 +34,7 @@ savevm_send_open_return_path(void) "" > savevm_send_ping(uint32_t val) "0x%x" > savevm_send_postcopy_listen(void) "" > savevm_send_postcopy_run(void) "" > +savevm_send_colo_enable(void) "" > savevm_state_setup(void) "" > savevm_state_header(void) "" > savevm_state_iterate(void) "" > diff --git a/vl.c b/vl.c > index 12e31d1aa9..a1576d2045 100644 > --- a/vl.c > +++ b/vl.c > @@ -4437,8 +4437,6 @@ int main(int argc, char **argv, char **envp) > #endif > } > > - colo_info_init(); > - > if (net_init_clients(&err) < 0) { > error_report_err(err); > exit(1); > -- > 2.17.0 > -- Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
On Wed, May 16, 2018 at 12:02 AM, Dr. David Alan Gilbert < dgilbert@redhat.com> wrote: > * Zhang Chen (zhangckid@gmail.com) wrote: > > We need to know if migration is going into COLO state for > > incoming side before start normal migration. > > > > Instead by using the VMStateDescription to send colo_state > > from source side to destination side, we use MIG_CMD_ENABLE_COLO > > to indicate whether COLO is enabled or not. > > > > Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com> > > Signed-off-by: Zhang Chen <zhangckid@gmail.com> > > Yes, that simplifies it a bit. > > Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> > Thanks your review. Zhang Chen > > > --- > > include/migration/colo.h | 5 +-- > > migration/Makefile.objs | 2 +- > > migration/colo-comm.c | 76 ---------------------------------------- > > migration/colo.c | 13 ++++++- > > migration/migration.c | 23 +++++++++++- > > migration/savevm.c | 20 +++++++++++ > > migration/savevm.h | 1 + > > migration/trace-events | 1 + > > vl.c | 2 -- > > 9 files changed, 60 insertions(+), 83 deletions(-) > > delete mode 100644 migration/colo-comm.c > > > > diff --git a/include/migration/colo.h b/include/migration/colo.h > > index fefb2fcf4c..99ce17aca7 100644 > > --- a/include/migration/colo.h > > +++ b/include/migration/colo.h > > @@ -28,8 +28,9 @@ void migrate_start_colo_process(MigrationState *s); > > bool migration_in_colo_state(void); > > > > /* loadvm */ > > -bool migration_incoming_enable_colo(void); > > -void migration_incoming_exit_colo(void); > > +void migration_incoming_enable_colo(void); > > +void migration_incoming_disable_colo(void); > > +bool migration_incoming_colo_enabled(void); > > void *colo_process_incoming_thread(void *opaque); > > bool migration_incoming_in_colo_state(void); > > > > diff --git a/migration/Makefile.objs b/migration/Makefile.objs > > index c83ec47ba8..a4f3bafd86 100644 > > --- a/migration/Makefile.objs > > +++ b/migration/Makefile.objs > > @@ -1,6 +1,6 @@ > > common-obj-y += migration.o socket.o fd.o exec.o > > common-obj-y += tls.o channel.o savevm.o > > -common-obj-y += colo-comm.o colo.o colo-failover.o > > +common-obj-y += colo.o colo-failover.o > > common-obj-y += vmstate.o vmstate-types.o page_cache.o > > common-obj-y += qemu-file.o global_state.o > > common-obj-y += qemu-file-channel.o > > diff --git a/migration/colo-comm.c b/migration/colo-comm.c > > deleted file mode 100644 > > index df26e4dfe7..0000000000 > > --- a/migration/colo-comm.c > > +++ /dev/null > > @@ -1,76 +0,0 @@ > > -/* > > - * COarse-grain LOck-stepping Virtual Machines for Non-stop Service > (COLO) > > - * (a.k.a. Fault Tolerance or Continuous Replication) > > - * > > - * Copyright (c) 2016 HUAWEI TECHNOLOGIES CO., LTD. > > - * Copyright (c) 2016 FUJITSU LIMITED > > - * Copyright (c) 2016 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 "qemu/osdep.h" > > -#include "migration.h" > > -#include "migration/colo.h" > > -#include "migration/vmstate.h" > > -#include "trace.h" > > - > > -typedef struct { > > - bool colo_requested; > > -} COLOInfo; > > - > > -static COLOInfo colo_info; > > - > > -COLOMode get_colo_mode(void) > > -{ > > - if (migration_in_colo_state()) { > > - return COLO_MODE_PRIMARY; > > - } else if (migration_incoming_in_colo_state()) { > > - return COLO_MODE_SECONDARY; > > - } else { > > - return COLO_MODE_UNKNOWN; > > - } > > -} > > - > > -static int colo_info_pre_save(void *opaque) > > -{ > > - COLOInfo *s = opaque; > > - > > - s->colo_requested = migrate_colo_enabled(); > > - > > - return 0; > > -} > > - > > -static bool colo_info_need(void *opaque) > > -{ > > - return migrate_colo_enabled(); > > -} > > - > > -static const VMStateDescription colo_state = { > > - .name = "COLOState", > > - .version_id = 1, > > - .minimum_version_id = 1, > > - .pre_save = colo_info_pre_save, > > - .needed = colo_info_need, > > - .fields = (VMStateField[]) { > > - VMSTATE_BOOL(colo_requested, COLOInfo), > > - VMSTATE_END_OF_LIST() > > - }, > > -}; > > - > > -void colo_info_init(void) > > -{ > > - vmstate_register(NULL, 0, &colo_state, &colo_info); > > -} > > - > > -bool migration_incoming_enable_colo(void) > > -{ > > - return colo_info.colo_requested; > > -} > > - > > -void migration_incoming_exit_colo(void) > > -{ > > - colo_info.colo_requested = false; > > -} > > diff --git a/migration/colo.c b/migration/colo.c > > index e06640c3d6..c083d3696f 100644 > > --- a/migration/colo.c > > +++ b/migration/colo.c > > @@ -152,6 +152,17 @@ static void primary_vm_do_failover(void) > > qemu_sem_post(&s->colo_exit_sem); > > } > > > > +COLOMode get_colo_mode(void) > > +{ > > + if (migration_in_colo_state()) { > > + return COLO_MODE_PRIMARY; > > + } else if (migration_incoming_in_colo_state()) { > > + return COLO_MODE_SECONDARY; > > + } else { > > + return COLO_MODE_UNKNOWN; > > + } > > +} > > + > > void colo_do_failover(MigrationState *s) > > { > > /* Make sure VM stopped while failover happened. */ > > @@ -745,7 +756,7 @@ out: > > if (mis->to_src_file) { > > qemu_fclose(mis->to_src_file); > > } > > - migration_incoming_exit_colo(); > > + migration_incoming_disable_colo(); > > > > return NULL; > > } > > diff --git a/migration/migration.c b/migration/migration.c > > index ddd0c4b988..8dee7dd309 100644 > > --- a/migration/migration.c > > +++ b/migration/migration.c > > @@ -277,6 +277,22 @@ int migrate_send_rp_req_pages(MigrationIncomingState > *mis, const char *rbname, > > return migrate_send_rp_message(mis, msg_type, msglen, bufc); > > } > > > > +static bool migration_colo_enabled; > > +bool migration_incoming_colo_enabled(void) > > +{ > > + return migration_colo_enabled; > > +} > > + > > +void migration_incoming_disable_colo(void) > > +{ > > + migration_colo_enabled = false; > > +} > > + > > +void migration_incoming_enable_colo(void) > > +{ > > + migration_colo_enabled = true; > > +} > > + > > void qemu_start_incoming_migration(const char *uri, Error **errp) > > { > > const char *p; > > @@ -388,7 +404,7 @@ static void process_incoming_migration_co(void > *opaque) > > } > > > > /* we get COLO info, and know if we are in COLO mode */ > > - if (!ret && migration_incoming_enable_colo()) { > > + if (!ret && migration_incoming_colo_enabled()) { > > /* Make sure all file formats flush their mutable metadata */ > > bdrv_invalidate_cache_all(&local_err); > > if (local_err) { > > @@ -2431,6 +2447,11 @@ static void *migration_thread(void *opaque) > > qemu_savevm_send_postcopy_advise(s->to_dst_file); > > } > > > > + if (migrate_colo_enabled()) { > > + /* Notify migration destination that we enable COLO */ > > + qemu_savevm_send_colo_enable(s->to_dst_file); > > + } > > + > > qemu_savevm_state_setup(s->to_dst_file); > > > > s->setup_time = qemu_clock_get_ms(QEMU_CLOCK_HOST) - setup_start; > > diff --git a/migration/savevm.c b/migration/savevm.c > > index e2be02afe4..c43d220220 100644 > > --- a/migration/savevm.c > > +++ b/migration/savevm.c > > @@ -55,6 +55,8 @@ > > #include "io/channel-buffer.h" > > #include "io/channel-file.h" > > #include "sysemu/replay.h" > > +#include "migration/colo.h" > > + > > > > #ifndef ETH_P_RARP > > #define ETH_P_RARP 0x8035 > > @@ -81,6 +83,9 @@ enum qemu_vm_cmd { > > were previously sent during > > precopy but are dirty. */ > > MIG_CMD_PACKAGED, /* Send a wrapped stream within this > stream */ > > + > > + MIG_CMD_ENABLE_COLO, /* Enable COLO */ > > + > > MIG_CMD_MAX > > }; > > > > @@ -836,6 +841,12 @@ static void qemu_savevm_command_send(QEMUFile *f, > > qemu_fflush(f); > > } > > > > +void qemu_savevm_send_colo_enable(QEMUFile *f) > > +{ > > + trace_savevm_send_colo_enable(); > > + qemu_savevm_command_send(f, MIG_CMD_ENABLE_COLO, 0, NULL); > > +} > > + > > void qemu_savevm_send_ping(QEMUFile *f, uint32_t value) > > { > > uint32_t buf; > > @@ -1793,6 +1804,12 @@ static int loadvm_handle_cmd_packaged(MigrationIncomingState > *mis) > > return ret; > > } > > > > +static int loadvm_process_enable_colo(MigrationIncomingState *mis) > > +{ > > + migration_incoming_enable_colo(); > > + return 0; > > +} > > + > > /* > > * Process an incoming 'QEMU_VM_COMMAND' > > * 0 just a normal return > > @@ -1866,6 +1883,9 @@ static int loadvm_process_command(QEMUFile *f) > > > > case MIG_CMD_POSTCOPY_RAM_DISCARD: > > return loadvm_postcopy_ram_handle_discard(mis, len); > > + > > + case MIG_CMD_ENABLE_COLO: > > + return loadvm_process_enable_colo(mis); > > } > > > > return 0; > > diff --git a/migration/savevm.h b/migration/savevm.h > > index cf4f0d37ca..c6d46b37a2 100644 > > --- a/migration/savevm.h > > +++ b/migration/savevm.h > > @@ -52,6 +52,7 @@ void qemu_savevm_send_postcopy_ram_discard(QEMUFile > *f, const char *name, > > uint16_t len, > > uint64_t *start_list, > > uint64_t *length_list); > > +void qemu_savevm_send_colo_enable(QEMUFile *f); > > > > int qemu_loadvm_state(QEMUFile *f); > > void qemu_loadvm_state_cleanup(void); > > diff --git a/migration/trace-events b/migration/trace-events > > index d6be74b7a7..9295b4cf40 100644 > > --- a/migration/trace-events > > +++ b/migration/trace-events > > @@ -34,6 +34,7 @@ savevm_send_open_return_path(void) "" > > savevm_send_ping(uint32_t val) "0x%x" > > savevm_send_postcopy_listen(void) "" > > savevm_send_postcopy_run(void) "" > > +savevm_send_colo_enable(void) "" > > savevm_state_setup(void) "" > > savevm_state_header(void) "" > > savevm_state_iterate(void) "" > > diff --git a/vl.c b/vl.c > > index 12e31d1aa9..a1576d2045 100644 > > --- a/vl.c > > +++ b/vl.c > > @@ -4437,8 +4437,6 @@ int main(int argc, char **argv, char **envp) > > #endif > > } > > > > - colo_info_init(); > > - > > if (net_init_clients(&err) < 0) { > > error_report_err(err); > > exit(1); > > -- > > 2.17.0 > > > -- > Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK >
diff --git a/include/migration/colo.h b/include/migration/colo.h index fefb2fcf4c..99ce17aca7 100644 --- a/include/migration/colo.h +++ b/include/migration/colo.h @@ -28,8 +28,9 @@ void migrate_start_colo_process(MigrationState *s); bool migration_in_colo_state(void); /* loadvm */ -bool migration_incoming_enable_colo(void); -void migration_incoming_exit_colo(void); +void migration_incoming_enable_colo(void); +void migration_incoming_disable_colo(void); +bool migration_incoming_colo_enabled(void); void *colo_process_incoming_thread(void *opaque); bool migration_incoming_in_colo_state(void); diff --git a/migration/Makefile.objs b/migration/Makefile.objs index c83ec47ba8..a4f3bafd86 100644 --- a/migration/Makefile.objs +++ b/migration/Makefile.objs @@ -1,6 +1,6 @@ common-obj-y += migration.o socket.o fd.o exec.o common-obj-y += tls.o channel.o savevm.o -common-obj-y += colo-comm.o colo.o colo-failover.o +common-obj-y += colo.o colo-failover.o common-obj-y += vmstate.o vmstate-types.o page_cache.o common-obj-y += qemu-file.o global_state.o common-obj-y += qemu-file-channel.o diff --git a/migration/colo-comm.c b/migration/colo-comm.c deleted file mode 100644 index df26e4dfe7..0000000000 --- a/migration/colo-comm.c +++ /dev/null @@ -1,76 +0,0 @@ -/* - * COarse-grain LOck-stepping Virtual Machines for Non-stop Service (COLO) - * (a.k.a. Fault Tolerance or Continuous Replication) - * - * Copyright (c) 2016 HUAWEI TECHNOLOGIES CO., LTD. - * Copyright (c) 2016 FUJITSU LIMITED - * Copyright (c) 2016 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 "qemu/osdep.h" -#include "migration.h" -#include "migration/colo.h" -#include "migration/vmstate.h" -#include "trace.h" - -typedef struct { - bool colo_requested; -} COLOInfo; - -static COLOInfo colo_info; - -COLOMode get_colo_mode(void) -{ - if (migration_in_colo_state()) { - return COLO_MODE_PRIMARY; - } else if (migration_incoming_in_colo_state()) { - return COLO_MODE_SECONDARY; - } else { - return COLO_MODE_UNKNOWN; - } -} - -static int colo_info_pre_save(void *opaque) -{ - COLOInfo *s = opaque; - - s->colo_requested = migrate_colo_enabled(); - - return 0; -} - -static bool colo_info_need(void *opaque) -{ - return migrate_colo_enabled(); -} - -static const VMStateDescription colo_state = { - .name = "COLOState", - .version_id = 1, - .minimum_version_id = 1, - .pre_save = colo_info_pre_save, - .needed = colo_info_need, - .fields = (VMStateField[]) { - VMSTATE_BOOL(colo_requested, COLOInfo), - VMSTATE_END_OF_LIST() - }, -}; - -void colo_info_init(void) -{ - vmstate_register(NULL, 0, &colo_state, &colo_info); -} - -bool migration_incoming_enable_colo(void) -{ - return colo_info.colo_requested; -} - -void migration_incoming_exit_colo(void) -{ - colo_info.colo_requested = false; -} diff --git a/migration/colo.c b/migration/colo.c index e06640c3d6..c083d3696f 100644 --- a/migration/colo.c +++ b/migration/colo.c @@ -152,6 +152,17 @@ static void primary_vm_do_failover(void) qemu_sem_post(&s->colo_exit_sem); } +COLOMode get_colo_mode(void) +{ + if (migration_in_colo_state()) { + return COLO_MODE_PRIMARY; + } else if (migration_incoming_in_colo_state()) { + return COLO_MODE_SECONDARY; + } else { + return COLO_MODE_UNKNOWN; + } +} + void colo_do_failover(MigrationState *s) { /* Make sure VM stopped while failover happened. */ @@ -745,7 +756,7 @@ out: if (mis->to_src_file) { qemu_fclose(mis->to_src_file); } - migration_incoming_exit_colo(); + migration_incoming_disable_colo(); return NULL; } diff --git a/migration/migration.c b/migration/migration.c index ddd0c4b988..8dee7dd309 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -277,6 +277,22 @@ int migrate_send_rp_req_pages(MigrationIncomingState *mis, const char *rbname, return migrate_send_rp_message(mis, msg_type, msglen, bufc); } +static bool migration_colo_enabled; +bool migration_incoming_colo_enabled(void) +{ + return migration_colo_enabled; +} + +void migration_incoming_disable_colo(void) +{ + migration_colo_enabled = false; +} + +void migration_incoming_enable_colo(void) +{ + migration_colo_enabled = true; +} + void qemu_start_incoming_migration(const char *uri, Error **errp) { const char *p; @@ -388,7 +404,7 @@ static void process_incoming_migration_co(void *opaque) } /* we get COLO info, and know if we are in COLO mode */ - if (!ret && migration_incoming_enable_colo()) { + if (!ret && migration_incoming_colo_enabled()) { /* Make sure all file formats flush their mutable metadata */ bdrv_invalidate_cache_all(&local_err); if (local_err) { @@ -2431,6 +2447,11 @@ static void *migration_thread(void *opaque) qemu_savevm_send_postcopy_advise(s->to_dst_file); } + if (migrate_colo_enabled()) { + /* Notify migration destination that we enable COLO */ + qemu_savevm_send_colo_enable(s->to_dst_file); + } + qemu_savevm_state_setup(s->to_dst_file); s->setup_time = qemu_clock_get_ms(QEMU_CLOCK_HOST) - setup_start; diff --git a/migration/savevm.c b/migration/savevm.c index e2be02afe4..c43d220220 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -55,6 +55,8 @@ #include "io/channel-buffer.h" #include "io/channel-file.h" #include "sysemu/replay.h" +#include "migration/colo.h" + #ifndef ETH_P_RARP #define ETH_P_RARP 0x8035 @@ -81,6 +83,9 @@ enum qemu_vm_cmd { were previously sent during precopy but are dirty. */ MIG_CMD_PACKAGED, /* Send a wrapped stream within this stream */ + + MIG_CMD_ENABLE_COLO, /* Enable COLO */ + MIG_CMD_MAX }; @@ -836,6 +841,12 @@ static void qemu_savevm_command_send(QEMUFile *f, qemu_fflush(f); } +void qemu_savevm_send_colo_enable(QEMUFile *f) +{ + trace_savevm_send_colo_enable(); + qemu_savevm_command_send(f, MIG_CMD_ENABLE_COLO, 0, NULL); +} + void qemu_savevm_send_ping(QEMUFile *f, uint32_t value) { uint32_t buf; @@ -1793,6 +1804,12 @@ static int loadvm_handle_cmd_packaged(MigrationIncomingState *mis) return ret; } +static int loadvm_process_enable_colo(MigrationIncomingState *mis) +{ + migration_incoming_enable_colo(); + return 0; +} + /* * Process an incoming 'QEMU_VM_COMMAND' * 0 just a normal return @@ -1866,6 +1883,9 @@ static int loadvm_process_command(QEMUFile *f) case MIG_CMD_POSTCOPY_RAM_DISCARD: return loadvm_postcopy_ram_handle_discard(mis, len); + + case MIG_CMD_ENABLE_COLO: + return loadvm_process_enable_colo(mis); } return 0; diff --git a/migration/savevm.h b/migration/savevm.h index cf4f0d37ca..c6d46b37a2 100644 --- a/migration/savevm.h +++ b/migration/savevm.h @@ -52,6 +52,7 @@ void qemu_savevm_send_postcopy_ram_discard(QEMUFile *f, const char *name, uint16_t len, uint64_t *start_list, uint64_t *length_list); +void qemu_savevm_send_colo_enable(QEMUFile *f); int qemu_loadvm_state(QEMUFile *f); void qemu_loadvm_state_cleanup(void); diff --git a/migration/trace-events b/migration/trace-events index d6be74b7a7..9295b4cf40 100644 --- a/migration/trace-events +++ b/migration/trace-events @@ -34,6 +34,7 @@ savevm_send_open_return_path(void) "" savevm_send_ping(uint32_t val) "0x%x" savevm_send_postcopy_listen(void) "" savevm_send_postcopy_run(void) "" +savevm_send_colo_enable(void) "" savevm_state_setup(void) "" savevm_state_header(void) "" savevm_state_iterate(void) "" diff --git a/vl.c b/vl.c index 12e31d1aa9..a1576d2045 100644 --- a/vl.c +++ b/vl.c @@ -4437,8 +4437,6 @@ int main(int argc, char **argv, char **envp) #endif } - colo_info_init(); - if (net_init_clients(&err) < 0) { error_report_err(err); exit(1);