From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53844) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z4o6G-0007Zc-JH for qemu-devel@nongnu.org; Tue, 16 Jun 2015 06:28:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z4o6F-0001GQ-47 for qemu-devel@nongnu.org; Tue, 16 Jun 2015 06:28:12 -0400 Received: from mx1.redhat.com ([209.132.183.28]:60158) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z4o6E-0001G9-S8 for qemu-devel@nongnu.org; Tue, 16 Jun 2015 06:28:11 -0400 From: "Dr. David Alan Gilbert (git)" Date: Tue, 16 Jun 2015 11:26:42 +0100 Message-Id: <1434450415-11339-30-git-send-email-dgilbert@redhat.com> In-Reply-To: <1434450415-11339-1-git-send-email-dgilbert@redhat.com> References: <1434450415-11339-1-git-send-email-dgilbert@redhat.com> Subject: [Qemu-devel] [PATCH v7 29/42] Postcopy end in migration_thread List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: aarcange@redhat.com, yamahata@private.email.ne.jp, quintela@redhat.com, liang.z.li@intel.com, luis@cs.umu.se, amit.shah@redhat.com, pbonzini@redhat.com, david@gibson.dropbear.id.au From: "Dr. David Alan Gilbert" 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. The end of migration code is getting a bit complciated now, so move out into its own function. Signed-off-by: Dr. David Alan Gilbert --- migration/migration.c | 91 +++++++++++++++++++++++++++++++++++++-------------- trace-events | 6 ++++ 2 files changed, 72 insertions(+), 25 deletions(-) diff --git a/migration/migration.c b/migration/migration.c index 8d15f33..3e5a7c8 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -1041,7 +1041,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) { @@ -1159,6 +1158,68 @@ fail: } /* + * Used by migration_thread when there's not much left pending. + * The caller 'breaks' the loop when this returns. + */ +static void migration_thread_end_of_iteration(MigrationState *s, + int current_active_state, + bool *old_vm_running, + int64_t *start_time) +{ + int ret; + 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 = 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(); + + if (ret < 0) { + goto fail; + } + } else if (s->state == MIGRATION_STATUS_POSTCOPY_ACTIVE) { + trace_migration_thread_end_of_iteration_postcopy_end(); + + qemu_savevm_state_complete_postcopy(s->file); + trace_migration_thread_end_of_iteration_postcopy_end_after_complete(); + } + + /* + * 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_thread_end_of_iteration_postcopy_end_before_rp(); + rp_error = await_return_path_close_on_source(s); + trace_migration_thread_end_of_iteration_postcopy_end_after_rp(rp_error); + if (rp_error) { + goto fail; + } + } + + if (qemu_file_get_error(s->file)) { + trace_migration_thread_end_of_iteration_file_err(); + goto fail; + } + + migrate_set_state(s, current_active_state, MIGRATION_STATUS_COMPLETED); + return; + +fail: + migrate_set_state(s, current_active_state, MIGRATION_STATUS_FAILED); +} + +/* * Master migration thread on the source VM. * It drives the migration and pumps the data down the outgoing channel. */ @@ -1233,31 +1294,11 @@ static void *migration_thread(void *opaque) /* Just another iteration step */ qemu_savevm_state_iterate(s->file); } else { - 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(); - - 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(); + trace_migration_thread_low_pending(pending_size); - if (ret < 0) { - migrate_set_state(s, MIGRATION_STATUS_ACTIVE, - MIGRATION_STATUS_FAILED); - break; - } - - if (!qemu_file_get_error(s->file)) { - migrate_set_state(s, MIGRATION_STATUS_ACTIVE, - MIGRATION_STATUS_COMPLETED); - break; - } + migration_thread_end_of_iteration(s, current_active_type, + &old_vm_running, &start_time); + break; } } diff --git a/trace-events b/trace-events index f096877..528d5a3 100644 --- a/trace-events +++ b/trace-events @@ -1425,6 +1425,12 @@ migrate_send_rp_message(int msg_type, uint16_t len) "%d: len %d" migration_thread_after_loop(void) "" migration_thread_file_err(void) "" migration_thread_setup_complete(void) "" +migration_thread_low_pending(uint64_t pending) "%" PRIu64 +migration_thread_end_of_iteration_file_err(void) "" +migration_thread_end_of_iteration_postcopy_end(void) "" +migration_thread_end_of_iteration_postcopy_end_after_complete(void) "" +migration_thread_end_of_iteration_postcopy_end_before_rp(void) "" +migration_thread_end_of_iteration_postcopy_end_after_rp(int rp_error) "%d" open_return_path_on_source(void) "" open_return_path_on_source_continue(void) "" postcopy_start(void) "" -- 2.4.3