Re: [PATCH V2 03/11] migration: save cpr mode

2024-07-18 Thread Steven Sistare

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

2024-07-17 Thread Fabiano Rosas
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

2024-06-30 Thread Steve Sistare
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