Re: [PATCH V2 03/11] migration: save cpr mode
On 7/17/2024 2:39 PM, Fabiano Rosas wrote: Steve Sistare 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 --- 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. Good idea, thanks - steve + +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;
Re: [PATCH V2 03/11] migration: save cpr mode
Steve Sistare 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 > --- > 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;
[PATCH V2 03/11] migration: save cpr mode
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 --- 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 + +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; -- 1.8.3.1