[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v4 08/32] migration: allow send_rq to fail
From: |
Dr. David Alan Gilbert |
Subject: |
Re: [Qemu-devel] [PATCH v4 08/32] migration: allow send_rq to fail |
Date: |
Thu, 30 Nov 2017 12:13:57 +0000 |
User-agent: |
Mutt/1.9.1 (2017-09-22) |
* Peter Xu (address@hidden) wrote:
> 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 8d93b891e3..db896233f6 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
> @@ -199,17 +199,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
> @@ -219,26 +237,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);
I don't think that move of the declaration of rbname_len is necessary;
it's only msglen that you need to keep for longer.
Dave
> 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 ebb049f692..b63cdfbfdb 100644
> --- a/migration/migration.h
> +++ b/migration/migration.h
> @@ -216,7 +216,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.13.6
>
--
Dr. David Alan Gilbert / address@hidden / Manchester, UK
- [Qemu-devel] [PATCH v4 00/32] Migration: postcopy failure recovery, Peter Xu, 2017/11/08
- [Qemu-devel] [PATCH v4 02/32] migration: reuse mis->userfault_quit_fd, Peter Xu, 2017/11/08
- [Qemu-devel] [PATCH v4 03/32] migration: provide postcopy_fault_thread_notify(), Peter Xu, 2017/11/08
- [Qemu-devel] [PATCH v4 01/32] migration: better error handling with QEMUFile, Peter Xu, 2017/11/08
- [Qemu-devel] [PATCH v4 04/32] migration: new postcopy-pause state, Peter Xu, 2017/11/08
- [Qemu-devel] [PATCH v4 06/32] migration: allow dst vm pause on postcopy, Peter Xu, 2017/11/08
- [Qemu-devel] [PATCH v4 08/32] migration: allow send_rq to fail, Peter Xu, 2017/11/08
- Re: [Qemu-devel] [PATCH v4 08/32] migration: allow send_rq to fail,
Dr. David Alan Gilbert <=
- [Qemu-devel] [PATCH v4 09/32] migration: allow fault thread to pause, Peter Xu, 2017/11/08
- [Qemu-devel] [PATCH v4 10/32] qmp: hmp: add migrate "resume" option, Peter Xu, 2017/11/08
- [Qemu-devel] [PATCH v4 11/32] migration: pass MigrationState to migrate_init(), Peter Xu, 2017/11/08
- [Qemu-devel] [PATCH v4 15/32] migration: new cmd MIG_CMD_RECV_BITMAP, Peter Xu, 2017/11/08
- [Qemu-devel] [PATCH v4 17/32] migration: new cmd MIG_CMD_POSTCOPY_RESUME, Peter Xu, 2017/11/08
- [Qemu-devel] [PATCH v4 18/32] migration: new message MIG_RP_MSG_RESUME_ACK, Peter Xu, 2017/11/08
- [Qemu-devel] [PATCH v4 19/32] migration: introduce SaveVMHandlers.resume_prepare, Peter Xu, 2017/11/08
- [Qemu-devel] [PATCH v4 20/32] migration: synchronize dirty bitmap for resume, Peter Xu, 2017/11/08
- [Qemu-devel] [PATCH v4 21/32] migration: setup ramstate for resume, Peter Xu, 2017/11/08
- [Qemu-devel] [PATCH v4 23/32] migration: free SocketAddress where allocated, Peter Xu, 2017/11/08