[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v6 07/28] migration: allow src return path to pause
From: |
Peter Xu |
Subject: |
[Qemu-devel] [PATCH v6 07/28] migration: allow src return path to pause |
Date: |
Thu, 8 Feb 2018 18:31:11 +0800 |
Let the thread pause for network issues.
Reviewed-by: Dr. David Alan Gilbert <address@hidden>
Signed-off-by: Peter Xu <address@hidden>
---
migration/migration.c | 35 +++++++++++++++++++++++++++++++++--
migration/migration.h | 1 +
migration/trace-events | 2 ++
3 files changed, 36 insertions(+), 2 deletions(-)
diff --git a/migration/migration.c b/migration/migration.c
index fc0d0e0e31..5c3b701102 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1688,6 +1688,18 @@ static void migrate_handle_rp_req_pages(MigrationState
*ms, const char* rbname,
}
}
+/* Return true to retry, false to quit */
+static bool postcopy_pause_return_path_thread(MigrationState *s)
+{
+ trace_postcopy_pause_return_path();
+
+ qemu_sem_wait(&s->postcopy_pause_rp_sem);
+
+ trace_postcopy_pause_return_path_continued();
+
+ return true;
+}
+
/*
* Handles messages sent on the return path towards the source VM
*
@@ -1704,6 +1716,8 @@ static void *source_return_path_thread(void *opaque)
int res;
trace_source_return_path_thread_entry();
+
+retry:
while (!ms->rp_state.error && !qemu_file_get_error(rp) &&
migration_is_setup_or_active(ms->state)) {
trace_source_return_path_thread_loop_top();
@@ -1795,13 +1809,28 @@ static void *source_return_path_thread(void *opaque)
break;
}
}
- if (qemu_file_get_error(rp)) {
+
+out:
+ res = qemu_file_get_error(rp);
+ if (res) {
+ if (res == -EIO) {
+ /*
+ * Maybe there is something we can do: it looks like a
+ * network down issue, and we pause for a recovery.
+ */
+ if (postcopy_pause_return_path_thread(ms)) {
+ /* Reload rp, reset the rest */
+ rp = ms->rp_state.from_dst_file;
+ ms->rp_state.error = false;
+ goto retry;
+ }
+ }
+
trace_source_return_path_thread_bad_end();
mark_source_rp_bad(ms);
}
trace_source_return_path_thread_end();
-out:
ms->rp_state.from_dst_file = NULL;
qemu_fclose(rp);
return NULL;
@@ -2609,6 +2638,7 @@ static void migration_instance_finalize(Object *obj)
g_free(params->tls_creds);
qemu_sem_destroy(&ms->pause_sem);
qemu_sem_destroy(&ms->postcopy_pause_sem);
+ qemu_sem_destroy(&ms->postcopy_pause_rp_sem);
}
static void migration_instance_init(Object *obj)
@@ -2639,6 +2669,7 @@ static void migration_instance_init(Object *obj)
params->has_xbzrle_cache_size = true;
qemu_sem_init(&ms->postcopy_pause_sem, 0);
+ qemu_sem_init(&ms->postcopy_pause_rp_sem, 0);
}
/*
diff --git a/migration/migration.h b/migration/migration.h
index 27ba256c40..765bd9f5bd 100644
--- a/migration/migration.h
+++ b/migration/migration.h
@@ -184,6 +184,7 @@ struct MigrationState
/* Needed by postcopy-pause state */
QemuSemaphore postcopy_pause_sem;
+ QemuSemaphore postcopy_pause_rp_sem;
};
void migrate_set_state(int *state, int old_state, int new_state);
diff --git a/migration/trace-events b/migration/trace-events
index 8685a62c98..ca17a70222 100644
--- a/migration/trace-events
+++ b/migration/trace-events
@@ -99,6 +99,8 @@ migration_thread_setup_complete(void) ""
open_return_path_on_source(void) ""
open_return_path_on_source_continue(void) ""
postcopy_start(void) ""
+postcopy_pause_return_path(void) ""
+postcopy_pause_return_path_continued(void) ""
postcopy_pause_continued(void) ""
postcopy_pause_incoming(void) ""
postcopy_pause_incoming_continued(void) ""
--
2.14.3
- [Qemu-devel] [PATCH v6 00/28] Migration: postcopy failure recovery, Peter Xu, 2018/02/08
- [Qemu-devel] [PATCH v6 01/28] migration: better error handling with QEMUFile, Peter Xu, 2018/02/08
- [Qemu-devel] [PATCH v6 03/28] migration: provide postcopy_fault_thread_notify(), Peter Xu, 2018/02/08
- [Qemu-devel] [PATCH v6 02/28] migration: reuse mis->userfault_quit_fd, Peter Xu, 2018/02/08
- [Qemu-devel] [PATCH v6 05/28] migration: implement "postcopy-pause" src logic, Peter Xu, 2018/02/08
- [Qemu-devel] [PATCH v6 04/28] migration: new postcopy-pause state, Peter Xu, 2018/02/08
- [Qemu-devel] [PATCH v6 06/28] migration: allow dst vm pause on postcopy, Peter Xu, 2018/02/08
- [Qemu-devel] [PATCH v6 07/28] migration: allow src return path to pause,
Peter Xu <=
- [Qemu-devel] [PATCH v6 08/28] migration: allow send_rq to fail, Peter Xu, 2018/02/08
- [Qemu-devel] [PATCH v6 09/28] migration: allow fault thread to pause, Peter Xu, 2018/02/08
- [Qemu-devel] [PATCH v6 10/28] qmp: hmp: add migrate "resume" option, Peter Xu, 2018/02/08
- [Qemu-devel] [PATCH v6 11/28] migration: pass MigrationState to migrate_init(), Peter Xu, 2018/02/08
- [Qemu-devel] [PATCH v6 12/28] migration: rebuild channel on source, Peter Xu, 2018/02/08
- [Qemu-devel] [PATCH v6 13/28] migration: new state "postcopy-recover", Peter Xu, 2018/02/08
- [Qemu-devel] [PATCH v6 14/28] migration: wakeup dst ram-load-thread for recover, Peter Xu, 2018/02/08
- [Qemu-devel] [PATCH v6 15/28] migration: new cmd MIG_CMD_RECV_BITMAP, Peter Xu, 2018/02/08
- [Qemu-devel] [PATCH v6 16/28] migration: new message MIG_RP_MSG_RECV_BITMAP, Peter Xu, 2018/02/08
- [Qemu-devel] [PATCH v6 17/28] migration: new cmd MIG_CMD_POSTCOPY_RESUME, Peter Xu, 2018/02/08