Ver código fonte

migrate_start_postcopy: Command to trigger transition to postcopy

Once postcopy is enabled (with migrate_set_capability), the migration
will still start on precopy mode.  To cause a transition into postcopy
the:

  migrate_start_postcopy

command must be issued.  Postcopy will start sometime after this
(when it's next checked in the migration loop).

Issuing the command before migration has started will error,
and issuing after it has finished is ignored.

Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Reviewed-by: Amit Shah <amit.shah@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
Dr. David Alan Gilbert 9 anos atrás
pai
commit
4886a1bcb7
7 arquivos alterados com 75 adições e 0 exclusões
  1. 15 0
      hmp-commands.hx
  2. 7 0
      hmp.c
  3. 1 0
      hmp.h
  4. 3 0
      include/migration/migration.h
  5. 22 0
      migration/migration.c
  6. 8 0
      qapi-schema.json
  7. 19 0
      qmp-commands.hx

+ 15 - 0
hmp-commands.hx

@@ -1005,6 +1005,21 @@ STEXI
 @item migrate_set_parameter @var{parameter} @var{value}
 @item migrate_set_parameter @var{parameter} @var{value}
 @findex migrate_set_parameter
 @findex migrate_set_parameter
 Set the parameter @var{parameter} for migration.
 Set the parameter @var{parameter} for migration.
+ETEXI
+
+    {
+        .name       = "migrate_start_postcopy",
+        .args_type  = "",
+        .params     = "",
+        .help       = "Switch migration to postcopy mode",
+        .mhandler.cmd = hmp_migrate_start_postcopy,
+    },
+
+STEXI
+@item migrate_start_postcopy
+@findex migrate_start_postcopy
+Switch in-progress migration to postcopy mode. Ignored after the end of
+migration (or once already in postcopy).
 ETEXI
 ETEXI
 
 
     {
     {

+ 7 - 0
hmp.c

@@ -1293,6 +1293,13 @@ void hmp_client_migrate_info(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, &err);
     hmp_handle_error(mon, &err);
 }
 }
 
 
+void hmp_migrate_start_postcopy(Monitor *mon, const QDict *qdict)
+{
+    Error *err = NULL;
+    qmp_migrate_start_postcopy(&err);
+    hmp_handle_error(mon, &err);
+}
+
 void hmp_set_password(Monitor *mon, const QDict *qdict)
 void hmp_set_password(Monitor *mon, const QDict *qdict)
 {
 {
     const char *protocol  = qdict_get_str(qdict, "protocol");
     const char *protocol  = qdict_get_str(qdict, "protocol");

+ 1 - 0
hmp.h

@@ -69,6 +69,7 @@ void hmp_migrate_set_capability(Monitor *mon, const QDict *qdict);
 void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict);
 void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict);
 void hmp_migrate_set_cache_size(Monitor *mon, const QDict *qdict);
 void hmp_migrate_set_cache_size(Monitor *mon, const QDict *qdict);
 void hmp_client_migrate_info(Monitor *mon, const QDict *qdict);
 void hmp_client_migrate_info(Monitor *mon, const QDict *qdict);
+void hmp_migrate_start_postcopy(Monitor *mon, const QDict *qdict);
 void hmp_set_password(Monitor *mon, const QDict *qdict);
 void hmp_set_password(Monitor *mon, const QDict *qdict);
 void hmp_expire_password(Monitor *mon, const QDict *qdict);
 void hmp_expire_password(Monitor *mon, const QDict *qdict);
 void hmp_eject(Monitor *mon, const QDict *qdict);
 void hmp_eject(Monitor *mon, const QDict *qdict);

+ 3 - 0
include/migration/migration.h

@@ -127,6 +127,9 @@ struct MigrationState
     int64_t xbzrle_cache_size;
     int64_t xbzrle_cache_size;
     int64_t setup_time;
     int64_t setup_time;
     int64_t dirty_sync_count;
     int64_t dirty_sync_count;
+
+    /* Flag set once the migration has been asked to enter postcopy */
+    bool start_postcopy;
 };
 };
 
 
 void process_incoming_migration(QEMUFile *f);
 void process_incoming_migration(QEMUFile *f);

+ 22 - 0
migration/migration.c

@@ -668,6 +668,28 @@ void qmp_migrate_set_parameters(bool has_compress_level,
     }
     }
 }
 }
 
 
+void qmp_migrate_start_postcopy(Error **errp)
+{
+    MigrationState *s = migrate_get_current();
+
+    if (!migrate_postcopy_ram()) {
+        error_setg(errp, "Enable postcopy with migration_set_capability before"
+                         " the start of migration");
+        return;
+    }
+
+    if (s->state == MIGRATION_STATUS_NONE) {
+        error_setg(errp, "Postcopy must be started after migration has been"
+                         " started");
+        return;
+    }
+    /*
+     * we don't error if migration has finished since that would be racy
+     * with issuing this command.
+     */
+    atomic_set(&s->start_postcopy, true);
+}
+
 /* shared migration helpers */
 /* shared migration helpers */
 
 
 static void migrate_set_state(MigrationState *s, int old_state, int new_state)
 static void migrate_set_state(MigrationState *s, int old_state, int new_state)

+ 8 - 0
qapi-schema.json

@@ -701,6 +701,14 @@
   'data': { 'protocol': 'str', 'hostname': 'str', '*port': 'int',
   'data': { 'protocol': 'str', 'hostname': 'str', '*port': 'int',
             '*tls-port': 'int', '*cert-subject': 'str' } }
             '*tls-port': 'int', '*cert-subject': 'str' } }
 
 
+##
+# @migrate-start-postcopy
+#
+# Switch migration to postcopy mode
+#
+# Since: 2.5
+{ 'command': 'migrate-start-postcopy' }
+
 ##
 ##
 # @MouseInfo:
 # @MouseInfo:
 #
 #

+ 19 - 0
qmp-commands.hx

@@ -717,6 +717,25 @@ Example:
 <- { "return": {} }
 <- { "return": {} }
 
 
 EQMP
 EQMP
+    {
+        .name       = "migrate-start-postcopy",
+        .args_type  = "",
+        .mhandler.cmd_new = qmp_marshal_migrate_start_postcopy,
+    },
+
+SQMP
+migrate-start-postcopy
+----------------------
+
+Switch an in-progress migration to postcopy mode. Ignored after the end of
+migration (or once already in postcopy).
+
+Example:
+-> { "execute": "migrate-start-postcopy" }
+<- { "return": {} }
+
+EQMP
+
     {
     {
         .name       = "query-migrate-cache-size",
         .name       = "query-migrate-cache-size",
         .args_type  = "",
         .args_type  = "",