@@ -78,5 +78,7 @@ void dirty_bitmap_mig_init(void);
MigMode migrate_mode(void);
MigMode migrate_mode_of(MigrationState *s);
+void migrate_enable_mode(MigMode mode);
+bool migrate_mode_enabled(MigMode mode);
#endif
@@ -173,6 +173,7 @@ INITIALIZE_MIGRATE_CAPS_SET(check_caps_background_snapshot,
static MigrationState *current_migration;
static MigrationIncomingState *current_incoming;
+static int migrate_enabled_modes = BIT(MIG_MODE_NORMAL);
static GSList *migration_blockers;
@@ -2140,6 +2141,29 @@ bool migration_is_active(MigrationState *s)
s->state == MIGRATION_STATUS_POSTCOPY_ACTIVE);
}
+void migrate_enable_mode(MigMode mode)
+{
+ migrate_enabled_modes |= BIT(mode);
+}
+
+bool migrate_mode_enabled(MigMode mode)
+{
+ return !!(migrate_enabled_modes & BIT(mode));
+}
+
+static int migrate_check_enabled(Error **errp)
+{
+ MigMode mode = migrate_mode();
+
+ if (!migrate_mode_enabled(mode)) {
+ error_setg(errp, "migrate mode is not enabled. "
+ "Use '-migrate-mode-enable %s'.",
+ MigMode_str(mode));
+ return -1;
+ }
+ return 0;
+}
+
void migrate_init(MigrationState *s)
{
/*
@@ -2210,6 +2234,9 @@ void qmp_migrate_incoming(const char *uri, Error **errp)
Error *local_err = NULL;
static bool once = true;
+ if (migrate_check_enabled(errp)) {
+ return;
+ }
if (!once) {
error_setg(errp, "The incoming migration has already been started");
return;
@@ -2356,6 +2383,10 @@ static bool migrate_prepare(MigrationState *s, bool blk, bool blk_inc,
return false;
}
+ if (migrate_check_enabled(errp)) {
+ return false;
+ }
+
if (migration_is_blocked(errp)) {
return false;
}
@@ -4491,6 +4491,16 @@ SRST
an unmigratable state.
ERST
+DEF("migrate-mode-enable", HAS_ARG, QEMU_OPTION_migrate_mode_enable, \
+ "-migrate-mode-enable <mode> enable the migration mode.\n",
+ QEMU_ARCH_ALL)
+SRST
+``-migrate-mode-enable <mode>``
+ Enable the specified migrate mode. May be supplied
+ multiple times, once per mode. This is a pre-requisite for performing a
+ migration using any mode except 'normal'.
+ERST
+
DEF("nodefaults", 0, QEMU_OPTION_nodefaults, \
"-nodefaults don't create default devices\n", QEMU_ARCH_ALL)
SRST
@@ -3364,6 +3364,10 @@ void qemu_init(int argc, char **argv, char **envp)
case QEMU_OPTION_only_migratable:
only_migratable = 1;
break;
+ case QEMU_OPTION_migrate_mode_enable:
+ migrate_enable_mode(qapi_enum_parse(&MigMode_lookup, optarg, -1,
+ &error_fatal));
+ break;
case QEMU_OPTION_nodefaults:
has_defaults = 0;
break;
Add the '-migrate-enable-mode <mode>' command-line option as a pre-requisite for migration using the mode. Multiple -migrate-enable-mode options may be specified, one per mode. Requiring -migrate-enable-mode allows qemu to initialize objects differently, if necessary, so that migration for a mode is not blocked. Signed-off-by: Steve Sistare <steven.sistare@oracle.com> --- include/migration/misc.h | 2 ++ migration/migration.c | 31 +++++++++++++++++++++++++++++++ qemu-options.hx | 10 ++++++++++ softmmu/vl.c | 4 ++++ 4 files changed, 47 insertions(+)