* [Qemu-devel] [PATCH v4 1/7] migration: Add 'pause-before-switchover' capability
2017-10-20 9:05 [Qemu-devel] [PATCH v4 0/7] migration: pause-before-switchover Dr. David Alan Gilbert (git)
@ 2017-10-20 9:05 ` Dr. David Alan Gilbert (git)
2017-10-23 10:55 ` Juan Quintela
2017-10-20 9:05 ` [Qemu-devel] [PATCH v4 2/7] migration: Add 'pre-switchover' and 'device' statuses Dr. David Alan Gilbert (git)
` (5 subsequent siblings)
6 siblings, 1 reply; 15+ messages in thread
From: Dr. David Alan Gilbert (git) @ 2017-10-20 9:05 UTC (permalink / raw)
To: qemu-devel, kwolf, jdenemar, wangjie88, quintela, peterx, mreitz
Cc: berrange, eblake, fuweiwei2
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
When 'pause-before-switchover' is enabled, the outgoing migration
will pause before invalidating the block devices and serializing
the device state.
At this point the management layer gets the chance to clean up any
device jobs or other device users before the migration completes.
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
---
migration/migration.c | 10 ++++++++++
migration/migration.h | 1 +
qapi/migration.json | 5 ++++-
3 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/migration/migration.c b/migration/migration.c
index 98429dc843..fba3342368 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1521,6 +1521,16 @@ bool migrate_use_multifd(void)
return s->enabled_capabilities[MIGRATION_CAPABILITY_X_MULTIFD];
}
+bool migrate_pause_before_switchover(void)
+{
+ MigrationState *s;
+
+ s = migrate_get_current();
+
+ return s->enabled_capabilities[
+ MIGRATION_CAPABILITY_PAUSE_BEFORE_SWITCHOVER];
+}
+
int migrate_multifd_channels(void)
{
MigrationState *s;
diff --git a/migration/migration.h b/migration/migration.h
index b83cceadc4..969866303e 100644
--- a/migration/migration.h
+++ b/migration/migration.h
@@ -177,6 +177,7 @@ bool migrate_zero_blocks(void);
bool migrate_auto_converge(void);
bool migrate_use_multifd(void);
+bool migrate_pause_before_switchover(void);
int migrate_multifd_channels(void);
int migrate_multifd_page_count(void);
diff --git a/qapi/migration.json b/qapi/migration.json
index f8b365e3f5..4960231ba2 100644
--- a/qapi/migration.json
+++ b/qapi/migration.json
@@ -341,6 +341,9 @@
# @return-path: If enabled, migration will use the return path even
# for precopy. (since 2.10)
#
+# @pause-before-switchover: Pause outgoing migration before serialising device
+# state and before disabling block IO (since 2.11)
+#
# @x-multifd: Use more than one fd for migration (since 2.11)
#
# Since: 1.2
@@ -348,7 +351,7 @@
{ 'enum': 'MigrationCapability',
'data': ['xbzrle', 'rdma-pin-all', 'auto-converge', 'zero-blocks',
'compress', 'events', 'postcopy-ram', 'x-colo', 'release-ram',
- 'block', 'return-path', 'x-multifd' ] }
+ 'block', 'return-path', 'pause-before-switchover', 'x-multifd' ] }
##
# @MigrationCapabilityStatus:
--
2.13.6
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [Qemu-devel] [PATCH v4 1/7] migration: Add 'pause-before-switchover' capability
2017-10-20 9:05 ` [Qemu-devel] [PATCH v4 1/7] migration: Add 'pause-before-switchover' capability Dr. David Alan Gilbert (git)
@ 2017-10-23 10:55 ` Juan Quintela
0 siblings, 0 replies; 15+ messages in thread
From: Juan Quintela @ 2017-10-23 10:55 UTC (permalink / raw)
To: Dr. David Alan Gilbert (git)
Cc: qemu-devel, kwolf, jdenemar, wangjie88, peterx, mreitz, berrange,
eblake, fuweiwei2
"Dr. David Alan Gilbert (git)" <dgilbert@redhat.com> wrote:
> From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
>
> When 'pause-before-switchover' is enabled, the outgoing migration
> will pause before invalidating the block devices and serializing
> the device state.
> At this point the management layer gets the chance to clean up any
> device jobs or other device users before the migration completes.
>
> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> Reviewed-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
^ permalink raw reply [flat|nested] 15+ messages in thread
* [Qemu-devel] [PATCH v4 2/7] migration: Add 'pre-switchover' and 'device' statuses
2017-10-20 9:05 [Qemu-devel] [PATCH v4 0/7] migration: pause-before-switchover Dr. David Alan Gilbert (git)
2017-10-20 9:05 ` [Qemu-devel] [PATCH v4 1/7] migration: Add 'pause-before-switchover' capability Dr. David Alan Gilbert (git)
@ 2017-10-20 9:05 ` Dr. David Alan Gilbert (git)
2017-10-23 10:55 ` Juan Quintela
2017-10-20 9:05 ` [Qemu-devel] [PATCH v4 3/7] migration: Wait for semaphore before completing migration Dr. David Alan Gilbert (git)
` (4 subsequent siblings)
6 siblings, 1 reply; 15+ messages in thread
From: Dr. David Alan Gilbert (git) @ 2017-10-20 9:05 UTC (permalink / raw)
To: qemu-devel, kwolf, jdenemar, wangjie88, quintela, peterx, mreitz
Cc: berrange, eblake, fuweiwei2
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
Add two statuses for use when the 'pause-before-switchover'
capability is enabled.
'pre-switchover' is the state that we wait in for management
to allow us to continue.
'device' is the state we enter while serialising the devices
after management gives us the OK.
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
---
migration/migration.c | 6 ++++++
qapi/migration.json | 8 +++++++-
2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/migration/migration.c b/migration/migration.c
index fba3342368..86ae0292f0 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -526,6 +526,8 @@ static bool migration_is_setup_or_active(int state)
case MIGRATION_STATUS_ACTIVE:
case MIGRATION_STATUS_POSTCOPY_ACTIVE:
case MIGRATION_STATUS_SETUP:
+ case MIGRATION_STATUS_PRE_SWITCHOVER:
+ case MIGRATION_STATUS_DEVICE:
return true;
default:
@@ -600,6 +602,8 @@ MigrationInfo *qmp_query_migrate(Error **errp)
case MIGRATION_STATUS_ACTIVE:
case MIGRATION_STATUS_CANCELLING:
case MIGRATION_STATUS_POSTCOPY_ACTIVE:
+ case MIGRATION_STATUS_PRE_SWITCHOVER:
+ case MIGRATION_STATUS_DEVICE:
/* TODO add some postcopy stats */
info->has_status = true;
info->has_total_time = true;
@@ -1183,6 +1187,8 @@ bool migration_is_idle(void)
case MIGRATION_STATUS_ACTIVE:
case MIGRATION_STATUS_POSTCOPY_ACTIVE:
case MIGRATION_STATUS_COLO:
+ case MIGRATION_STATUS_PRE_SWITCHOVER:
+ case MIGRATION_STATUS_DEVICE:
return false;
case MIGRATION_STATUS__MAX:
g_assert_not_reached();
diff --git a/qapi/migration.json b/qapi/migration.json
index 4960231ba2..b56f95db64 100644
--- a/qapi/migration.json
+++ b/qapi/migration.json
@@ -96,12 +96,18 @@
# @colo: VM is in the process of fault tolerance, VM can not get into this
# state unless colo capability is enabled for migration. (since 2.8)
#
+# @pre-switchover: Paused before device serialisation. (since 2.11)
+#
+# @device: During device serialisation when pause-before-switchover is enabled
+# (since 2.11)
+#
# Since: 2.3
#
##
{ 'enum': 'MigrationStatus',
'data': [ 'none', 'setup', 'cancelling', 'cancelled',
- 'active', 'postcopy-active', 'completed', 'failed', 'colo' ] }
+ 'active', 'postcopy-active', 'completed', 'failed', 'colo',
+ 'pre-switchover', 'device' ] }
##
# @MigrationInfo:
--
2.13.6
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [Qemu-devel] [PATCH v4 2/7] migration: Add 'pre-switchover' and 'device' statuses
2017-10-20 9:05 ` [Qemu-devel] [PATCH v4 2/7] migration: Add 'pre-switchover' and 'device' statuses Dr. David Alan Gilbert (git)
@ 2017-10-23 10:55 ` Juan Quintela
0 siblings, 0 replies; 15+ messages in thread
From: Juan Quintela @ 2017-10-23 10:55 UTC (permalink / raw)
To: Dr. David Alan Gilbert (git)
Cc: qemu-devel, kwolf, jdenemar, wangjie88, peterx, mreitz, berrange,
eblake, fuweiwei2
"Dr. David Alan Gilbert (git)" <dgilbert@redhat.com> wrote:
> From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
>
> Add two statuses for use when the 'pause-before-switchover'
> capability is enabled.
>
> 'pre-switchover' is the state that we wait in for management
> to allow us to continue.
> 'device' is the state we enter while serialising the devices
> after management gives us the OK.
>
> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> Reviewed-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
^ permalink raw reply [flat|nested] 15+ messages in thread
* [Qemu-devel] [PATCH v4 3/7] migration: Wait for semaphore before completing migration
2017-10-20 9:05 [Qemu-devel] [PATCH v4 0/7] migration: pause-before-switchover Dr. David Alan Gilbert (git)
2017-10-20 9:05 ` [Qemu-devel] [PATCH v4 1/7] migration: Add 'pause-before-switchover' capability Dr. David Alan Gilbert (git)
2017-10-20 9:05 ` [Qemu-devel] [PATCH v4 2/7] migration: Add 'pre-switchover' and 'device' statuses Dr. David Alan Gilbert (git)
@ 2017-10-20 9:05 ` Dr. David Alan Gilbert (git)
2017-10-23 11:02 ` Juan Quintela
2017-10-20 9:05 ` [Qemu-devel] [PATCH v4 4/7] migration: migrate-continue Dr. David Alan Gilbert (git)
` (3 subsequent siblings)
6 siblings, 1 reply; 15+ messages in thread
From: Dr. David Alan Gilbert (git) @ 2017-10-20 9:05 UTC (permalink / raw)
To: qemu-devel, kwolf, jdenemar, wangjie88, quintela, peterx, mreitz
Cc: berrange, eblake, fuweiwei2
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
Wait for a semaphore before completing the migration,
if the previously added capability was enabled.
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
---
migration/migration.c | 38 ++++++++++++++++++++++++++++++++++++++
migration/migration.h | 3 +++
2 files changed, 41 insertions(+)
diff --git a/migration/migration.c b/migration/migration.c
index 86ae0292f0..6c6d5e2c75 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1968,6 +1968,39 @@ fail:
}
/**
+ * migration_maybe_pause: Pause if required to by
+ * migrate_pause_before_switchover called with the iothread locked
+ * Returns: 0 on success
+ */
+static int migration_maybe_pause(MigrationState *s, int *current_active_state)
+{
+ if (!migrate_pause_before_switchover()) {
+ return 0;
+ }
+
+ /* Since leaving this state is not atomic with posting the semaphore
+ * it's possible that someone could have issued multiple migrate_continue
+ * and the semaphore is incorrectly positive at this point;
+ * the docs say it's undefined to reinit a semaphore that's already
+ * init'd, so use timedwait to eat up any existing posts.
+ */
+ while (qemu_sem_timedwait(&s->pause_sem, 1) == 0) {
+ /* This block intentionally left blank */
+ }
+
+ qemu_mutex_unlock_iothread();
+ migrate_set_state(&s->state, *current_active_state,
+ MIGRATION_STATUS_PRE_SWITCHOVER);
+ qemu_sem_wait(&s->pause_sem);
+ migrate_set_state(&s->state, MIGRATION_STATUS_PRE_SWITCHOVER,
+ MIGRATION_STATUS_DEVICE);
+ *current_active_state = MIGRATION_STATUS_DEVICE;
+ qemu_mutex_lock_iothread();
+
+ return s->state == MIGRATION_STATUS_DEVICE ? 0 : -EINVAL;
+}
+
+/**
* migration_completion: Used by migration_thread when there's not much left.
* The caller 'breaks' the loop when this returns.
*
@@ -1993,6 +2026,9 @@ static void migration_completion(MigrationState *s, int current_active_state,
bool inactivate = !migrate_colo_enabled();
ret = vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
if (ret >= 0) {
+ ret = migration_maybe_pause(s, ¤t_active_state);
+ }
+ if (ret >= 0) {
qemu_file_set_rate_limit(s->to_dst_file, INT64_MAX);
ret = qemu_savevm_state_complete_precopy(s->to_dst_file, false,
inactivate);
@@ -2373,6 +2409,7 @@ static void migration_instance_finalize(Object *obj)
g_free(params->tls_hostname);
g_free(params->tls_creds);
+ qemu_sem_destroy(&ms->pause_sem);
}
static void migration_instance_init(Object *obj)
@@ -2383,6 +2420,7 @@ static void migration_instance_init(Object *obj)
ms->state = MIGRATION_STATUS_NONE;
ms->xbzrle_cache_size = DEFAULT_MIGRATE_CACHE_SIZE;
ms->mbps = -1;
+ qemu_sem_init(&ms->pause_sem, 0);
params->tls_hostname = g_strdup("");
params->tls_creds = g_strdup("");
diff --git a/migration/migration.h b/migration/migration.h
index 969866303e..cd988a99b9 100644
--- a/migration/migration.h
+++ b/migration/migration.h
@@ -121,6 +121,9 @@ struct MigrationState
/* Flag set once the migration thread called bdrv_inactivate_all */
bool block_inactive;
+ /* Migration is paused due to pause-before-switchover */
+ QemuSemaphore pause_sem;
+
/* The semaphore is used to notify COLO thread that failover is finished */
QemuSemaphore colo_exit_sem;
--
2.13.6
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [Qemu-devel] [PATCH v4 3/7] migration: Wait for semaphore before completing migration
2017-10-20 9:05 ` [Qemu-devel] [PATCH v4 3/7] migration: Wait for semaphore before completing migration Dr. David Alan Gilbert (git)
@ 2017-10-23 11:02 ` Juan Quintela
0 siblings, 0 replies; 15+ messages in thread
From: Juan Quintela @ 2017-10-23 11:02 UTC (permalink / raw)
To: Dr. David Alan Gilbert (git)
Cc: qemu-devel, kwolf, jdenemar, wangjie88, peterx, mreitz, berrange,
eblake, fuweiwei2
"Dr. David Alan Gilbert (git)" <dgilbert@redhat.com> wrote:
> From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
>
> Wait for a semaphore before completing the migration,
> if the previously added capability was enabled.
>
> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> Reviewed-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
> + while (qemu_sem_timedwait(&s->pause_sem, 1) == 0) {
wait
> + /* This block intentionally left blank */
> + }
> +
> + qemu_sem_wait(&s->pause_sem);
wait
and no posts on the whole patchset.
I agree that we only wait if we enable the feature, but still O:-)
^ permalink raw reply [flat|nested] 15+ messages in thread
* [Qemu-devel] [PATCH v4 4/7] migration: migrate-continue
2017-10-20 9:05 [Qemu-devel] [PATCH v4 0/7] migration: pause-before-switchover Dr. David Alan Gilbert (git)
` (2 preceding siblings ...)
2017-10-20 9:05 ` [Qemu-devel] [PATCH v4 3/7] migration: Wait for semaphore before completing migration Dr. David Alan Gilbert (git)
@ 2017-10-20 9:05 ` Dr. David Alan Gilbert (git)
2017-10-23 11:03 ` Juan Quintela
2017-10-20 9:05 ` [Qemu-devel] [PATCH v4 5/7] migrate: HMP migate_continue Dr. David Alan Gilbert (git)
` (2 subsequent siblings)
6 siblings, 1 reply; 15+ messages in thread
From: Dr. David Alan Gilbert (git) @ 2017-10-20 9:05 UTC (permalink / raw)
To: qemu-devel, kwolf, jdenemar, wangjie88, quintela, peterx, mreitz
Cc: berrange, eblake, fuweiwei2
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
A new qmp command allows the caller to continue from a given
paused state.
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
---
migration/migration.c | 11 +++++++++++
qapi/migration.json | 17 +++++++++++++++++
2 files changed, 28 insertions(+)
diff --git a/migration/migration.c b/migration/migration.c
index 6c6d5e2c75..c9a3ee9efd 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1368,6 +1368,17 @@ void qmp_migrate_cancel(Error **errp)
migrate_fd_cancel(migrate_get_current());
}
+void qmp_migrate_continue(MigrationStatus state, Error **errp)
+{
+ MigrationState *s = migrate_get_current();
+ if (s->state != state) {
+ error_setg(errp, "Migration not in expected state: %s",
+ MigrationStatus_str(s->state));
+ return;
+ }
+ qemu_sem_post(&s->pause_sem);
+}
+
void qmp_migrate_set_cache_size(int64_t value, Error **errp)
{
MigrationState *s = migrate_get_current();
diff --git a/qapi/migration.json b/qapi/migration.json
index b56f95db64..272f191551 100644
--- a/qapi/migration.json
+++ b/qapi/migration.json
@@ -877,6 +877,23 @@
{ 'command': 'migrate_cancel' }
##
+# @migrate-continue:
+#
+# Continue migration when it's in a paused state.
+#
+# @state: The state the migration is currently expected to be in
+#
+# Returns: nothing on success
+# Since: 2.11
+# Example:
+#
+# -> { "execute": "migrate-continue" , "arguments":
+# { "state": "pre-switchover" } }
+# <- { "return": {} }
+##
+{ 'command': 'migrate-continue', 'data': {'state': 'MigrationStatus'} }
+
+##
# @migrate_set_downtime:
#
# Set maximum tolerated downtime for migration.
--
2.13.6
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [Qemu-devel] [PATCH v4 4/7] migration: migrate-continue
2017-10-20 9:05 ` [Qemu-devel] [PATCH v4 4/7] migration: migrate-continue Dr. David Alan Gilbert (git)
@ 2017-10-23 11:03 ` Juan Quintela
0 siblings, 0 replies; 15+ messages in thread
From: Juan Quintela @ 2017-10-23 11:03 UTC (permalink / raw)
To: Dr. David Alan Gilbert (git)
Cc: qemu-devel, kwolf, jdenemar, wangjie88, peterx, mreitz, berrange,
eblake, fuweiwei2
"Dr. David Alan Gilbert (git)" <dgilbert@redhat.com> wrote:
> From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
>
> A new qmp command allows the caller to continue from a given
> paused state.
>
> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> Reviewed-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
> + qemu_sem_post(&s->pause_sem);
one of the missing posts
^ permalink raw reply [flat|nested] 15+ messages in thread
* [Qemu-devel] [PATCH v4 5/7] migrate: HMP migate_continue
2017-10-20 9:05 [Qemu-devel] [PATCH v4 0/7] migration: pause-before-switchover Dr. David Alan Gilbert (git)
` (3 preceding siblings ...)
2017-10-20 9:05 ` [Qemu-devel] [PATCH v4 4/7] migration: migrate-continue Dr. David Alan Gilbert (git)
@ 2017-10-20 9:05 ` Dr. David Alan Gilbert (git)
2017-10-23 11:03 ` Juan Quintela
2017-10-20 9:05 ` [Qemu-devel] [PATCH v4 6/7] migration: allow cancel to unpause Dr. David Alan Gilbert (git)
2017-10-20 9:05 ` [Qemu-devel] [PATCH v4 7/7] migration: pause-before-switchover for postcopy Dr. David Alan Gilbert (git)
6 siblings, 1 reply; 15+ messages in thread
From: Dr. David Alan Gilbert (git) @ 2017-10-20 9:05 UTC (permalink / raw)
To: qemu-devel, kwolf, jdenemar, wangjie88, quintela, peterx, mreitz
Cc: berrange, eblake, fuweiwei2
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
HMP equivalent to the just added migrate-continue
Unpause a migrate paused at a given state.
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
---
hmp-commands.hx | 12 ++++++++++++
hmp.c | 13 +++++++++++++
hmp.h | 1 +
3 files changed, 26 insertions(+)
diff --git a/hmp-commands.hx b/hmp-commands.hx
index 1941e19932..4afd57cf5f 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -959,7 +959,19 @@ STEXI
@item migrate_cancel
@findex migrate_cancel
Cancel the current VM migration.
+ETEXI
+ {
+ .name = "migrate_continue",
+ .args_type = "state:s",
+ .params = "state",
+ .help = "Continue migration from the given paused state",
+ .cmd = hmp_migrate_continue,
+ },
+STEXI
+@item migrate_continue @var{state}
+@findex migrate_continue
+Continue migration from the paused state @var{state}
ETEXI
{
diff --git a/hmp.c b/hmp.c
index ec61329ebb..41fcce6f5a 100644
--- a/hmp.c
+++ b/hmp.c
@@ -1495,6 +1495,19 @@ void hmp_migrate_cancel(Monitor *mon, const QDict *qdict)
qmp_migrate_cancel(NULL);
}
+void hmp_migrate_continue(Monitor *mon, const QDict *qdict)
+{
+ Error *err = NULL;
+ const char *state = qdict_get_str(qdict, "state");
+ int val = qapi_enum_parse(&MigrationStatus_lookup, state, -1, &err);
+
+ if (val >= 0) {
+ qmp_migrate_continue(val, &err);
+ }
+
+ hmp_handle_error(mon, &err);
+}
+
void hmp_migrate_incoming(Monitor *mon, const QDict *qdict)
{
Error *err = NULL;
diff --git a/hmp.h b/hmp.h
index 3605003e4c..a6f56b1f29 100644
--- a/hmp.h
+++ b/hmp.h
@@ -68,6 +68,7 @@ void hmp_savevm(Monitor *mon, const QDict *qdict);
void hmp_delvm(Monitor *mon, const QDict *qdict);
void hmp_info_snapshots(Monitor *mon, const QDict *qdict);
void hmp_migrate_cancel(Monitor *mon, const QDict *qdict);
+void hmp_migrate_continue(Monitor *mon, const QDict *qdict);
void hmp_migrate_incoming(Monitor *mon, const QDict *qdict);
void hmp_migrate_set_downtime(Monitor *mon, const QDict *qdict);
void hmp_migrate_set_speed(Monitor *mon, const QDict *qdict);
--
2.13.6
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [Qemu-devel] [PATCH v4 6/7] migration: allow cancel to unpause
2017-10-20 9:05 [Qemu-devel] [PATCH v4 0/7] migration: pause-before-switchover Dr. David Alan Gilbert (git)
` (4 preceding siblings ...)
2017-10-20 9:05 ` [Qemu-devel] [PATCH v4 5/7] migrate: HMP migate_continue Dr. David Alan Gilbert (git)
@ 2017-10-20 9:05 ` Dr. David Alan Gilbert (git)
2017-10-23 11:04 ` Juan Quintela
2017-10-20 9:05 ` [Qemu-devel] [PATCH v4 7/7] migration: pause-before-switchover for postcopy Dr. David Alan Gilbert (git)
6 siblings, 1 reply; 15+ messages in thread
From: Dr. David Alan Gilbert (git) @ 2017-10-20 9:05 UTC (permalink / raw)
To: qemu-devel, kwolf, jdenemar, wangjie88, quintela, peterx, mreitz
Cc: berrange, eblake, fuweiwei2
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
If a migration_cancel is issued during the new paused state,
kick the pause_sem to get to unpause so it can cancel.
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
---
migration/migration.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/migration/migration.c b/migration/migration.c
index c9a3ee9efd..756deb3e2c 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1108,6 +1108,10 @@ static void migrate_fd_cancel(MigrationState *s)
if (!migration_is_setup_or_active(old_state)) {
break;
}
+ /* If the migration is paused, kick it out of the pause */
+ if (old_state == MIGRATION_STATUS_PRE_SWITCHOVER) {
+ qemu_sem_post(&s->pause_sem);
+ }
migrate_set_state(&s->state, old_state, MIGRATION_STATUS_CANCELLING);
} while (s->state != MIGRATION_STATUS_CANCELLING);
--
2.13.6
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [Qemu-devel] [PATCH v4 6/7] migration: allow cancel to unpause
2017-10-20 9:05 ` [Qemu-devel] [PATCH v4 6/7] migration: allow cancel to unpause Dr. David Alan Gilbert (git)
@ 2017-10-23 11:04 ` Juan Quintela
0 siblings, 0 replies; 15+ messages in thread
From: Juan Quintela @ 2017-10-23 11:04 UTC (permalink / raw)
To: Dr. David Alan Gilbert (git)
Cc: qemu-devel, kwolf, jdenemar, wangjie88, peterx, mreitz, berrange,
eblake, fuweiwei2
"Dr. David Alan Gilbert (git)" <dgilbert@redhat.com> wrote:
> From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
>
> If a migration_cancel is issued during the new paused state,
> kick the pause_sem to get to unpause so it can cancel.
>
> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> Reviewed-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
^ permalink raw reply [flat|nested] 15+ messages in thread
* [Qemu-devel] [PATCH v4 7/7] migration: pause-before-switchover for postcopy
2017-10-20 9:05 [Qemu-devel] [PATCH v4 0/7] migration: pause-before-switchover Dr. David Alan Gilbert (git)
` (5 preceding siblings ...)
2017-10-20 9:05 ` [Qemu-devel] [PATCH v4 6/7] migration: allow cancel to unpause Dr. David Alan Gilbert (git)
@ 2017-10-20 9:05 ` Dr. David Alan Gilbert (git)
2017-10-23 11:05 ` Juan Quintela
6 siblings, 1 reply; 15+ messages in thread
From: Dr. David Alan Gilbert (git) @ 2017-10-20 9:05 UTC (permalink / raw)
To: qemu-devel, kwolf, jdenemar, wangjie88, quintela, peterx, mreitz
Cc: berrange, eblake, fuweiwei2
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
Add pause-before-switchover support for postcopy.
After starting postcopy it will transition
active->pre-switchover->postcopy_active
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
---
migration/migration.c | 29 ++++++++++++++++++++++-------
1 file changed, 22 insertions(+), 7 deletions(-)
diff --git a/migration/migration.c b/migration/migration.c
index 756deb3e2c..af587377e9 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -104,6 +104,9 @@ enum mig_rp_message_type {
static MigrationState *current_migration;
static bool migration_object_check(MigrationState *ms, Error **errp);
+static int migration_maybe_pause(MigrationState *s,
+ int *current_active_state,
+ int new_state);
void migration_object_init(void)
{
@@ -1830,8 +1833,11 @@ static int postcopy_start(MigrationState *ms, bool *old_vm_running)
QEMUFile *fb;
int64_t time_at_stop = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
bool restart_block = false;
- migrate_set_state(&ms->state, MIGRATION_STATUS_ACTIVE,
- MIGRATION_STATUS_POSTCOPY_ACTIVE);
+ int cur_state = MIGRATION_STATUS_ACTIVE;
+ if (!migrate_pause_before_switchover()) {
+ migrate_set_state(&ms->state, MIGRATION_STATUS_ACTIVE,
+ MIGRATION_STATUS_POSTCOPY_ACTIVE);
+ }
trace_postcopy_start();
qemu_mutex_lock_iothread();
@@ -1845,6 +1851,12 @@ static int postcopy_start(MigrationState *ms, bool *old_vm_running)
goto fail;
}
+ ret = migration_maybe_pause(ms, &cur_state,
+ MIGRATION_STATUS_POSTCOPY_ACTIVE);
+ if (ret < 0) {
+ goto fail;
+ }
+
ret = bdrv_inactivate_all();
if (ret < 0) {
goto fail;
@@ -1987,7 +1999,9 @@ fail:
* migrate_pause_before_switchover called with the iothread locked
* Returns: 0 on success
*/
-static int migration_maybe_pause(MigrationState *s, int *current_active_state)
+static int migration_maybe_pause(MigrationState *s,
+ int *current_active_state,
+ int new_state)
{
if (!migrate_pause_before_switchover()) {
return 0;
@@ -2008,11 +2022,11 @@ static int migration_maybe_pause(MigrationState *s, int *current_active_state)
MIGRATION_STATUS_PRE_SWITCHOVER);
qemu_sem_wait(&s->pause_sem);
migrate_set_state(&s->state, MIGRATION_STATUS_PRE_SWITCHOVER,
- MIGRATION_STATUS_DEVICE);
- *current_active_state = MIGRATION_STATUS_DEVICE;
+ new_state);
+ *current_active_state = new_state;
qemu_mutex_lock_iothread();
- return s->state == MIGRATION_STATUS_DEVICE ? 0 : -EINVAL;
+ return s->state == new_state ? 0 : -EINVAL;
}
/**
@@ -2041,7 +2055,8 @@ static void migration_completion(MigrationState *s, int current_active_state,
bool inactivate = !migrate_colo_enabled();
ret = vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
if (ret >= 0) {
- ret = migration_maybe_pause(s, ¤t_active_state);
+ ret = migration_maybe_pause(s, ¤t_active_state,
+ MIGRATION_STATUS_DEVICE);
}
if (ret >= 0) {
qemu_file_set_rate_limit(s->to_dst_file, INT64_MAX);
--
2.13.6
^ permalink raw reply related [flat|nested] 15+ messages in thread