[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v9 39/56] Postcopy: End of iteration
From: |
Dr. David Alan Gilbert (git) |
Subject: |
[Qemu-devel] [PATCH v9 39/56] Postcopy: End of iteration |
Date: |
Thu, 5 Nov 2015 18:11:06 +0000 |
From: "Dr. David Alan Gilbert" <address@hidden>
The end of migration in postcopy is a bit different since some of
the things normally done at the end of migration have already been
done on the transition to postcopy.
Signed-off-by: Dr. David Alan Gilbert <address@hidden>
Reviewed-by: Juan Quintela <address@hidden>
Reviewed-by: Amit Shah <address@hidden>
---
migration/migration.c | 51 +++++++++++++++++++++++++++++++++++++--------------
trace-events | 6 +++++-
2 files changed, 42 insertions(+), 15 deletions(-)
diff --git a/migration/migration.c b/migration/migration.c
index e68bc43..b860777 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1258,7 +1258,6 @@ static int open_return_path_on_source(MigrationState *ms)
return 0;
}
-__attribute__ (( unused )) /* Until later in patch series */
/* Returns 0 if the RP was ok, otherwise there was an error on the RP */
static int await_return_path_close_on_source(MigrationState *ms)
{
@@ -1399,23 +1398,47 @@ static void migration_completion(MigrationState *s, int
current_active_state,
{
int ret;
- qemu_mutex_lock_iothread();
- *start_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
- qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER);
- *old_vm_running = runstate_is_running();
+ if (s->state == MIGRATION_STATUS_ACTIVE) {
+ qemu_mutex_lock_iothread();
+ *start_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
+ qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER);
+ *old_vm_running = runstate_is_running();
+ ret = global_state_store();
+
+ if (!ret) {
+ ret = vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
+ if (ret >= 0) {
+ qemu_file_set_rate_limit(s->file, INT64_MAX);
+ qemu_savevm_state_complete_precopy(s->file);
+ }
+ }
+ qemu_mutex_unlock_iothread();
- ret = global_state_store();
- if (!ret) {
- ret = vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
- if (ret >= 0) {
- qemu_file_set_rate_limit(s->file, INT64_MAX);
- qemu_savevm_state_complete_precopy(s->file);
+ if (ret < 0) {
+ goto fail;
}
+ } else if (s->state == MIGRATION_STATUS_POSTCOPY_ACTIVE) {
+ trace_migration_completion_postcopy_end();
+
+ qemu_savevm_state_complete_postcopy(s->file);
+ trace_migration_completion_postcopy_end_after_complete();
}
- qemu_mutex_unlock_iothread();
- if (ret < 0) {
- goto fail;
+ /*
+ * If rp was opened we must clean up the thread before
+ * cleaning everything else up (since if there are no failures
+ * it will wait for the destination to send it's status in
+ * a SHUT command).
+ * Postcopy opens rp if enabled (even if it's not avtivated)
+ */
+ if (migrate_postcopy_ram()) {
+ int rp_error;
+ trace_migration_completion_postcopy_end_before_rp();
+ rp_error = await_return_path_close_on_source(s);
+ trace_migration_completion_postcopy_end_after_rp(rp_error);
+ if (rp_error) {
+ goto fail;
+ }
}
if (qemu_file_get_error(s->file)) {
diff --git a/trace-events b/trace-events
index 9b7876e..401d4c3 100644
--- a/trace-events
+++ b/trace-events
@@ -1453,6 +1453,11 @@ migrate_fd_error(void) ""
migrate_fd_cancel(void) ""
migrate_pending(uint64_t size, uint64_t max, uint64_t post, uint64_t nonpost)
"pending size %" PRIu64 " max %" PRIu64 " (post=%" PRIu64 " nonpost=%" PRIu64
")"
migrate_send_rp_message(int msg_type, uint16_t len) "%d: len %d"
+migration_completion_file_err(void) ""
+migration_completion_postcopy_end(void) ""
+migration_completion_postcopy_end_after_complete(void) ""
+migration_completion_postcopy_end_before_rp(void) ""
+migration_completion_postcopy_end_after_rp(int rp_error) "%d"
migration_thread_after_loop(void) ""
migration_thread_file_err(void) ""
migration_thread_setup_complete(void) ""
@@ -1470,7 +1475,6 @@ migrate_transferred(uint64_t tranferred, uint64_t
time_spent, double bandwidth,
migrate_state_too_big(void) ""
migrate_global_state_post_load(const char *state) "loaded state: %s"
migrate_global_state_pre_save(const char *state) "saved state: %s"
-migration_completion_file_err(void) ""
migration_thread_low_pending(uint64_t pending) "%" PRIu64
# migration/rdma.c
--
2.5.0
- [Qemu-devel] [PATCH v9 34/56] Postcopy: Maintain unsentmap, (continued)
- [Qemu-devel] [PATCH v9 34/56] Postcopy: Maintain unsentmap, Dr. David Alan Gilbert (git), 2015/11/05
- [Qemu-devel] [PATCH v9 35/56] Postcopy: Calculate discard, Dr. David Alan Gilbert (git), 2015/11/05
- [Qemu-devel] [PATCH v9 37/56] postcopy: ram_enable_notify to switch on userfault, Dr. David Alan Gilbert (git), 2015/11/05
- [Qemu-devel] [PATCH v9 36/56] postcopy: Incoming initialisation, Dr. David Alan Gilbert (git), 2015/11/05
- [Qemu-devel] [PATCH v9 38/56] Postcopy: Postcopy startup in migration thread, Dr. David Alan Gilbert (git), 2015/11/05
- [Qemu-devel] [PATCH v9 40/56] Page request: Add MIG_RP_MSG_REQ_PAGES reverse command, Dr. David Alan Gilbert (git), 2015/11/05
- [Qemu-devel] [PATCH v9 39/56] Postcopy: End of iteration,
Dr. David Alan Gilbert (git) <=
- [Qemu-devel] [PATCH v9 41/56] Page request: Process incoming page request, Dr. David Alan Gilbert (git), 2015/11/05
- [Qemu-devel] [PATCH v9 42/56] Page request: Consume pages off the post-copy queue, Dr. David Alan Gilbert (git), 2015/11/05
- [Qemu-devel] [PATCH v9 44/56] Postcopy: Use helpers to map pages during migration, Dr. David Alan Gilbert (git), 2015/11/05
- [Qemu-devel] [PATCH v9 43/56] postcopy_ram.c: place_page and helpers, Dr. David Alan Gilbert (git), 2015/11/05
- [Qemu-devel] [PATCH v9 45/56] postcopy: Check order of received target pages, Dr. David Alan Gilbert (git), 2015/11/05
- [Qemu-devel] [PATCH v9 46/56] Don't sync dirty bitmaps in postcopy, Dr. David Alan Gilbert (git), 2015/11/05
- [Qemu-devel] [PATCH v9 47/56] Don't iterate on precopy-only devices during postcopy, Dr. David Alan Gilbert (git), 2015/11/05
- [Qemu-devel] [PATCH v9 48/56] Host page!=target page: Cleanup bitmaps, Dr. David Alan Gilbert (git), 2015/11/05