Steve Sistare <steven.sist...@oracle.com> writes: > Save the mode in CPR state, so the user does not need to explicitly specify > it for the target. Modify migrate_mode() so it returns the incoming mode on > the target. > > Signed-off-by: Steve Sistare <steven.sist...@oracle.com> > --- > include/migration/cpr.h | 7 +++++++ > migration/cpr.c | 23 ++++++++++++++++++++++- > migration/migration.c | 1 + > migration/options.c | 9 +++++++-- > 4 files changed, 37 insertions(+), 3 deletions(-) > > diff --git a/include/migration/cpr.h b/include/migration/cpr.h > index 8e7e705..42b4019 100644 > --- a/include/migration/cpr.h > +++ b/include/migration/cpr.h > @@ -8,6 +8,13 @@ > #ifndef MIGRATION_CPR_H > #define MIGRATION_CPR_H > > +#include "qapi/qapi-types-migration.h" > + > +#define MIG_MODE_NONE MIG_MODE__MAX
What happens when a QEMU that knows about a new mode migrates into a QEMU that doesn't know that mode, i.e. sees it as MIG_MODE__MAX? I'd just use -1. > + > +MigMode cpr_get_incoming_mode(void); > +void cpr_set_incoming_mode(MigMode mode); > + > typedef int (*cpr_walk_fd_cb)(int fd); > void cpr_save_fd(const char *name, int id, int fd); > void cpr_delete_fd(const char *name, int id); > diff --git a/migration/cpr.c b/migration/cpr.c > index 313e74e..1c296c6 100644 > --- a/migration/cpr.c > +++ b/migration/cpr.c > @@ -21,10 +21,23 @@ > typedef QLIST_HEAD(CprFdList, CprFd) CprFdList; > > typedef struct CprState { > + MigMode mode; > CprFdList fds; > } CprState; > > -static CprState cpr_state; > +static CprState cpr_state = { > + .mode = MIG_MODE_NONE, > +}; > + > +MigMode cpr_get_incoming_mode(void) > +{ > + return cpr_state.mode; > +} > + > +void cpr_set_incoming_mode(MigMode mode) > +{ > + cpr_state.mode = mode; > +} > > > /****************************************************************************/ > > @@ -124,11 +137,19 @@ void cpr_resave_fd(const char *name, int id, int fd) > /*************************************************************************/ > #define CPR_STATE "CprState" > > +static int cpr_state_presave(void *opaque) > +{ > + cpr_state.mode = migrate_mode(); > + return 0; > +} > + > static const VMStateDescription vmstate_cpr_state = { > .name = CPR_STATE, > .version_id = 1, > .minimum_version_id = 1, > + .pre_save = cpr_state_presave, > .fields = (VMStateField[]) { > + VMSTATE_UINT32(mode, CprState), > VMSTATE_QLIST_V(fds, CprState, 1, vmstate_cpr_fd, CprFd, next), > VMSTATE_END_OF_LIST() > } > diff --git a/migration/migration.c b/migration/migration.c > index e394ad7..0f47765 100644 > --- a/migration/migration.c > +++ b/migration/migration.c > @@ -411,6 +411,7 @@ void migration_incoming_state_destroy(void) > mis->postcopy_qemufile_dst = NULL; > } > > + cpr_set_incoming_mode(MIG_MODE_NONE); > yank_unregister_instance(MIGRATION_YANK_INSTANCE); > } > > diff --git a/migration/options.c b/migration/options.c > index 645f550..305397a 100644 > --- a/migration/options.c > +++ b/migration/options.c > @@ -22,6 +22,7 @@ > #include "qapi/qmp/qnull.h" > #include "sysemu/runstate.h" > #include "migration/colo.h" > +#include "migration/cpr.h" > #include "migration/misc.h" > #include "migration.h" > #include "migration-stats.h" > @@ -758,8 +759,12 @@ uint64_t migrate_max_postcopy_bandwidth(void) > > MigMode migrate_mode(void) > { > - MigrationState *s = migrate_get_current(); > - MigMode mode = s->parameters.mode; > + MigMode mode = cpr_get_incoming_mode(); > + > + if (mode == MIG_MODE_NONE) { > + MigrationState *s = migrate_get_current(); > + mode = s->parameters.mode; > + } > > assert(mode >= 0 && mode < MIG_MODE__MAX); > return mode;