[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC v2 12/33] migration: allow send_rq to fail
From: |
Peter Xu |
Subject: |
[Qemu-devel] [RFC v2 12/33] migration: allow send_rq to fail |
Date: |
Wed, 30 Aug 2017 16:32:09 +0800 |
We will not allow failures to happen when sending data from destination
to source via the return path. However it is possible that there can be
errors along the way. This patch allows the migrate_send_rp_message()
to return error when it happens, and further extended it to
migrate_send_rp_req_pages().
Reviewed-by: Dr. David Alan Gilbert <address@hidden>
Signed-off-by: Peter Xu <address@hidden>
---
migration/migration.c | 38 ++++++++++++++++++++++++++++++--------
migration/migration.h | 2 +-
2 files changed, 31 insertions(+), 9 deletions(-)
diff --git a/migration/migration.c b/migration/migration.c
index b3cd8be..d42209d 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -195,17 +195,35 @@ static void deferred_incoming_migration(Error **errp)
* Send a message on the return channel back to the source
* of the migration.
*/
-static void migrate_send_rp_message(MigrationIncomingState *mis,
- enum mig_rp_message_type message_type,
- uint16_t len, void *data)
+static int migrate_send_rp_message(MigrationIncomingState *mis,
+ enum mig_rp_message_type message_type,
+ uint16_t len, void *data)
{
+ int ret = 0;
+
trace_migrate_send_rp_message((int)message_type, len);
qemu_mutex_lock(&mis->rp_mutex);
+
+ /*
+ * It's possible that the file handle got lost due to network
+ * failures.
+ */
+ if (!mis->to_src_file) {
+ ret = -EIO;
+ goto error;
+ }
+
qemu_put_be16(mis->to_src_file, (unsigned int)message_type);
qemu_put_be16(mis->to_src_file, len);
qemu_put_buffer(mis->to_src_file, data, len);
qemu_fflush(mis->to_src_file);
+
+ /* It's possible that qemu file got error during sending */
+ ret = qemu_file_get_error(mis->to_src_file);
+
+error:
qemu_mutex_unlock(&mis->rp_mutex);
+ return ret;
}
/* Request a range of pages from the source VM at the given
@@ -215,26 +233,30 @@ static void
migrate_send_rp_message(MigrationIncomingState *mis,
* Start: Address offset within the RB
* Len: Length in bytes required - must be a multiple of pagesize
*/
-void migrate_send_rp_req_pages(MigrationIncomingState *mis, const char *rbname,
- ram_addr_t start, size_t len)
+int migrate_send_rp_req_pages(MigrationIncomingState *mis, const char *rbname,
+ ram_addr_t start, size_t len)
{
uint8_t bufc[12 + 1 + 255]; /* start (8), len (4), rbname up to 256 */
size_t msglen = 12; /* start + len */
+ int rbname_len;
+ enum mig_rp_message_type msg_type;
*(uint64_t *)bufc = cpu_to_be64((uint64_t)start);
*(uint32_t *)(bufc + 8) = cpu_to_be32((uint32_t)len);
if (rbname) {
- int rbname_len = strlen(rbname);
+ rbname_len = strlen(rbname);
assert(rbname_len < 256);
bufc[msglen++] = rbname_len;
memcpy(bufc + msglen, rbname, rbname_len);
msglen += rbname_len;
- migrate_send_rp_message(mis, MIG_RP_MSG_REQ_PAGES_ID, msglen, bufc);
+ msg_type = MIG_RP_MSG_REQ_PAGES_ID;
} else {
- migrate_send_rp_message(mis, MIG_RP_MSG_REQ_PAGES, msglen, bufc);
+ msg_type = MIG_RP_MSG_REQ_PAGES;
}
+
+ return migrate_send_rp_message(mis, msg_type, msglen, bufc);
}
void qemu_start_incoming_migration(const char *uri, Error **errp)
diff --git a/migration/migration.h b/migration/migration.h
index 323d88d..6333391 100644
--- a/migration/migration.h
+++ b/migration/migration.h
@@ -199,7 +199,7 @@ void migrate_send_rp_shut(MigrationIncomingState *mis,
uint32_t value);
void migrate_send_rp_pong(MigrationIncomingState *mis,
uint32_t value);
-void migrate_send_rp_req_pages(MigrationIncomingState *mis, const char* rbname,
+int migrate_send_rp_req_pages(MigrationIncomingState *mis, const char* rbname,
ram_addr_t start, size_t len);
#endif
--
2.7.4
- [Qemu-devel] [RFC v2 02/33] bitmap: introduce bitmap_count_one(), (continued)
- [Qemu-devel] [RFC v2 02/33] bitmap: introduce bitmap_count_one(), Peter Xu, 2017/08/30
- [Qemu-devel] [RFC v2 03/33] bitmap: provide to_le/from_le helpers, Peter Xu, 2017/08/30
- [Qemu-devel] [RFC v2 04/33] migration: dump str in migrate_set_state trace, Peter Xu, 2017/08/30
- [Qemu-devel] [RFC v2 05/33] migration: better error handling with QEMUFile, Peter Xu, 2017/08/30
- [Qemu-devel] [RFC v2 06/33] migration: reuse mis->userfault_quit_fd, Peter Xu, 2017/08/30
- [Qemu-devel] [RFC v2 07/33] migration: provide postcopy_fault_thread_notify(), Peter Xu, 2017/08/30
- [Qemu-devel] [RFC v2 09/33] migration: implement "postcopy-pause" src logic, Peter Xu, 2017/08/30
- [Qemu-devel] [RFC v2 08/33] migration: new postcopy-pause state, Peter Xu, 2017/08/30
- [Qemu-devel] [RFC v2 10/33] migration: allow dst vm pause on postcopy, Peter Xu, 2017/08/30
- [Qemu-devel] [RFC v2 11/33] migration: allow src return path to pause, Peter Xu, 2017/08/30
- [Qemu-devel] [RFC v2 12/33] migration: allow send_rq to fail,
Peter Xu <=
- [Qemu-devel] [RFC v2 13/33] migration: allow fault thread to pause, Peter Xu, 2017/08/30
- [Qemu-devel] [RFC v2 14/33] qmp: hmp: add migrate "resume" option, Peter Xu, 2017/08/30
- [Qemu-devel] [RFC v2 15/33] migration: pass MigrationState to migrate_init(), Peter Xu, 2017/08/30
- [Qemu-devel] [RFC v2 16/33] migration: rebuild channel on source, Peter Xu, 2017/08/30
- [Qemu-devel] [RFC v2 17/33] migration: new state "postcopy-recover", Peter Xu, 2017/08/30
- [Qemu-devel] [RFC v2 18/33] migration: wakeup dst ram-load-thread for recover, Peter Xu, 2017/08/30
- [Qemu-devel] [RFC v2 19/33] migration: new cmd MIG_CMD_RECV_BITMAP, Peter Xu, 2017/08/30
- [Qemu-devel] [RFC v2 20/33] migration: new message MIG_RP_MSG_RECV_BITMAP, Peter Xu, 2017/08/30
- [Qemu-devel] [RFC v2 21/33] migration: new cmd MIG_CMD_POSTCOPY_RESUME, Peter Xu, 2017/08/30
- [Qemu-devel] [RFC v2 22/33] migration: new message MIG_RP_MSG_RESUME_ACK, Peter Xu, 2017/08/30