diff options
| author | Peter Maydell <peter.maydell@linaro.org> | 2015-03-16 14:45:09 +0000 |
|---|---|---|
| committer | Peter Maydell <peter.maydell@linaro.org> | 2015-03-16 14:45:09 +0000 |
| commit | bc68d2e5128284c8beb98b1c5b0331a0ed9f3197 (patch) | |
| tree | 1b195e276395920f19d7c8ca30aafb90416ebc71 /migration/migration.c | |
| parent | dcf848c478dd8765bd4f746fc4e80eaad44cf87d (diff) | |
| parent | 54ed388b29794ab08089f1b5c7b0a03d075c3b5d (diff) | |
| download | focaccia-qemu-bc68d2e5128284c8beb98b1c5b0331a0ed9f3197.tar.gz focaccia-qemu-bc68d2e5128284c8beb98b1c5b0331a0ed9f3197.zip | |
Merge remote-tracking branch 'remotes/juanquintela/tags/migration/20150316' into staging
migration/next for 20150316 # gpg: Signature made Mon Mar 16 13:36:37 2015 GMT using RSA key ID 5872D723 # gpg: Can't check signature: public key not found * remotes/juanquintela/tags/migration/20150316: pc: Disable vmdesc submission for old machines migration: Allow to suppress vmdesc submission migration: Read JSON VM description on incoming migration rename save_block_hdr to save_page_header save_block_hdr: we can recalculate the cont parameter here save_xbzrle_page: change calling convention ram_save_page: change calling covention ram_find_and_save_block: change calling convention ram: make all save_page functions take a uint64_t parameter Add migrate_incoming Add -incoming defer Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'migration/migration.c')
| -rw-r--r-- | migration/migration.c | 48 |
1 files changed, 42 insertions, 6 deletions
diff --git a/migration/migration.c b/migration/migration.c index b3adbc653a..2c805f11f5 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -49,6 +49,8 @@ enum { static NotifierList migration_state_notifiers = NOTIFIER_LIST_INITIALIZER(migration_state_notifiers); +static bool deferred_incoming; + /* When we add fault tolerance, we could have several migrations at once. For now we don't need to add dynamic creation of migration */ @@ -65,25 +67,40 @@ MigrationState *migrate_get_current(void) return ¤t_migration; } +/* + * Called on -incoming with a defer: uri. + * The migration can be started later after any parameters have been + * changed. + */ +static void deferred_incoming_migration(Error **errp) +{ + if (deferred_incoming) { + error_setg(errp, "Incoming migration already deferred"); + } + deferred_incoming = true; +} + void qemu_start_incoming_migration(const char *uri, Error **errp) { const char *p; - if (strstart(uri, "tcp:", &p)) + if (!strcmp(uri, "defer")) { + deferred_incoming_migration(errp); + } else if (strstart(uri, "tcp:", &p)) { tcp_start_incoming_migration(p, errp); #ifdef CONFIG_RDMA - else if (strstart(uri, "rdma:", &p)) + } else if (strstart(uri, "rdma:", &p)) { rdma_start_incoming_migration(p, errp); #endif #if !defined(WIN32) - else if (strstart(uri, "exec:", &p)) + } else if (strstart(uri, "exec:", &p)) { exec_start_incoming_migration(p, errp); - else if (strstart(uri, "unix:", &p)) + } else if (strstart(uri, "unix:", &p)) { unix_start_incoming_migration(p, errp); - else if (strstart(uri, "fd:", &p)) + } else if (strstart(uri, "fd:", &p)) { fd_start_incoming_migration(p, errp); #endif - else { + } else { error_setg(errp, "unknown migration protocol: %s", uri); } } @@ -415,6 +432,25 @@ void migrate_del_blocker(Error *reason) migration_blockers = g_slist_remove(migration_blockers, reason); } +void qmp_migrate_incoming(const char *uri, Error **errp) +{ + Error *local_err = NULL; + + if (!deferred_incoming) { + error_setg(errp, "'-incoming defer' is required for migrate_incoming"); + return; + } + + qemu_start_incoming_migration(uri, &local_err); + + if (local_err) { + error_propagate(errp, local_err); + return; + } + + deferred_incoming = false; +} + void qmp_migrate(const char *uri, bool has_blk, bool blk, bool has_inc, bool inc, bool has_detach, bool detach, Error **errp) |