Message ID | 20180509112406.6183-37-quintela@redhat.com |
---|---|
State | New |
Headers | show |
Series | [PULL,01/41] migration: fix saving normal page even if it's been compressed | expand |
On 05/09/2018 06:24 AM, Juan Quintela wrote: > From: Peter Xu <peterx@redhat.com> > > It pauses an ongoing migration. Currently it only supports postcopy. > Note that this command will work on either side of the migration. > Basically when we trigger this on one side, it'll interrupt the other > side as well since the other side will get notified on the disconnect > event. > > However, it's still possible that the other side is not notified, for > example, when the network is totally broken, or due to some firewall > configuration changes. In that case, we will also need to run the same > command on the other side so both sides will go into the paused state. > > +++ b/qapi/migration.json > @@ -1211,3 +1211,19 @@ > ## > { 'command': 'migrate-recover', 'data': { 'uri': 'str' }, > 'allow-oob': true } > + > +## > +# @migrate-pause: > +# > +# Pause a migration. Currently it only supports postcopy. > +# > +# Returns: nothing. > +# > +# Example: > +# > +# -> { "execute": "migrate-pause" } > +# <- { "return": {} } > +# > +# Since: 2.12 Another 2.13 fixup > +## > +{ 'command': 'migrate-pause', 'allow-oob': true } >
diff --git a/migration/migration.c b/migration/migration.c index 3deded90e5..05aec2c905 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -1507,6 +1507,35 @@ void qmp_migrate_recover(const char *uri, Error **errp) qemu_start_incoming_migration(uri, errp); } +void qmp_migrate_pause(Error **errp) +{ + MigrationState *ms = migrate_get_current(); + MigrationIncomingState *mis = migration_incoming_get_current(); + int ret; + + if (ms->state == MIGRATION_STATUS_POSTCOPY_ACTIVE) { + /* Source side, during postcopy */ + qemu_mutex_lock(&ms->qemu_file_lock); + ret = qemu_file_shutdown(ms->to_dst_file); + qemu_mutex_unlock(&ms->qemu_file_lock); + if (ret) { + error_setg(errp, "Failed to pause source migration"); + } + return; + } + + if (mis->state == MIGRATION_STATUS_POSTCOPY_ACTIVE) { + ret = qemu_file_shutdown(mis->from_src_file); + if (ret) { + error_setg(errp, "Failed to pause destination migration"); + } + return; + } + + error_setg(errp, "migrate-pause is currently only supported " + "during postcopy-active state"); +} + bool migration_is_blocked(Error **errp) { if (qemu_savevm_state_blocked(errp)) { diff --git a/qapi/migration.json b/qapi/migration.json index ec739cbd04..7e9283c613 100644 --- a/qapi/migration.json +++ b/qapi/migration.json @@ -1211,3 +1211,19 @@ ## { 'command': 'migrate-recover', 'data': { 'uri': 'str' }, 'allow-oob': true } + +## +# @migrate-pause: +# +# Pause a migration. Currently it only supports postcopy. +# +# Returns: nothing. +# +# Example: +# +# -> { "execute": "migrate-pause" } +# <- { "return": {} } +# +# Since: 2.12 +## +{ 'command': 'migrate-pause', 'allow-oob': true }