From: Paolo Bonzini <pbonzini@redhat.com>
To: Lei Li <lilei@linux.vnet.ibm.com>
Cc: aarcange@redhat.com, aliguori@us.ibm.com, quintela@redhat.com,
qemu-devel@nongnu.org, mrhines@linux.vnet.ibm.com,
mdroth@linux.vnet.ibm.com, lagarcia@br.ibm.com,
rcj@linux.vnet.ibm.com
Subject: Re: [Qemu-devel] [PATCH 12/17] migration-local: override hook_ram_load
Date: Thu, 24 Oct 2013 15:06:36 +0100 [thread overview]
Message-ID: <5269296C.2040206@redhat.com> (raw)
In-Reply-To: <1382412341-1173-13-git-send-email-lilei@linux.vnet.ibm.com>
Il 22/10/2013 04:25, Lei Li ha scritto:
> Override hook_ram_load to receive the pipe file descriptor
> passed by source process and page address which will be
> extracted to vmsplice the page data from pipe.
>
> Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
> ---
> migration-local.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 85 insertions(+), 0 deletions(-)
>
> diff --git a/migration-local.c b/migration-local.c
> index 7ccec30..083a24f 100644
> --- a/migration-local.c
> +++ b/migration-local.c
> @@ -32,6 +32,8 @@
> #include "trace.h"
> #include "qemu/osdep.h"
>
> +#define BEFORE_PIPE_FD 199
> +
> //#define DEBUG_MIGRATION_LOCAL
>
> #ifdef DEBUG_MIGRATION_LOCAL
> @@ -50,6 +52,8 @@ typedef struct QEMUFileLocal {
> bool unix_page_flipping;
> } QEMUFileLocal;
>
> +static bool pipefd_passed;
> +
> static int qemu_local_get_sockfd(void *opaque)
> {
> QEMUFileLocal *s = opaque;
> @@ -64,6 +68,22 @@ static int qemu_local_get_buffer(void *opaque, uint8_t *buf,
> ssize_t len;
>
> for (;;) {
> + /*
> + * FIX ME: BEFORE_PIPE_FD is hard-coded and checked temporarily here
> + * because that the control message of passed pipe file descriptor
> + * might be 'eaten' to stream file by qemu_recv(), which would lead
> + * to the failure of recv_pipefd(), as it should stay in the socket
> + * and received by the real receiver recvmsg().
> + *
> + * Although this message is followed by the first load_hook flags
> + * RAM_SAVE_FLAG_HOOK, the incoming side is hardly to avoid this
> + * as it would fill it into the stream file before any check action
> + * taken. Need to find a way out to fix this.
> + */
> + if (size > BEFORE_PIPE_FD && !pipefd_passed) {
> + size = BEFORE_PIPE_FD;
> + }
I think you can simply use recvmsg always, or at least until !pipefd_passed.
> len = qemu_recv(s->sockfd, buf, size, 0);
> if (len != -1) {
> break;
> @@ -115,6 +135,7 @@ static int qemu_local_close(void *opaque)
> }
>
> static int send_pipefd(int sockfd, int pipefd);
> +static int recv_pipefd(int sockfd);
>
> static int qemu_local_send_pipefd(QEMUFile *f, void *opaque,
> uint64_t flags)
> @@ -192,10 +213,74 @@ static size_t qemu_local_save_ram(QEMUFile *f, void *opaque,
> return RAM_SAVE_CONTROL_NOT_SUPP;
> }
>
> +static int qemu_local_ram_load(QEMUFile *f, void *opaque,
> + uint64_t flags)
> +{
> + QEMUFileLocal *s = opaque;
> + ram_addr_t addr;
> + struct iovec iov;
> + ssize_t ret;
> +
> + /* Receive the pipe file descripter passed from source process */
> + if (!pipefd_passed) {
> + s->pipefd[0] = recv_pipefd(s->sockfd);
> + if (s->pipefd[0] <= 0) {
> + fprintf(stderr, "failed to receive pipe fd: %d\n", s->pipefd[0]);
> + } else {
> + pipefd_passed = 1;
> + DPRINTF(stderr, "succeed\n");
> + }
> +
> + return s->pipefd[0];
> + }
> +
> + if (pipefd_passed) {
> + void *host;
> +
> + /*
> + * Extract the page address from the 8-byte record and
> + * read the page data from the pipe.
> + */
> + addr = qemu_get_be64(s->file);
> + host = qemu_get_ram_ptr(addr);
> +
> + iov.iov_base = host;
> + iov.iov_len = TARGET_PAGE_SIZE;
> +
> + /* The flag SPLICE_F_MOVE is introduced in kernel for the page
> + * flipping feature in QEMU, which will movie pages rather than
> + * copying, previously unused.
> + *
> + * If a move is not possible the kernel will transparently falls
> + * back to copying data.
> + *
> + * For older kernels the SPLICE_F_MOVE would be ignored and a copy
> + * would occur.
> + */
> + ret = vmsplice(s->pipefd[0], &iov, 1, SPLICE_F_MOVE);
> + if (ret == -1) {
> + if (errno != EAGAIN && errno != EINTR) {
> + fprintf(stderr, "vmsplice() load error: %s", strerror(errno));
> + return ret;
> + }
> + DPRINTF("vmsplice load error\n");
> + } else if (ret == 0) {
> + DPRINTF(stderr, "load_page: zero read\n");
> + }
> +
> + DPRINTF("vmsplice (read): %zu\n", ret);
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> +
> static const QEMUFileOps pipe_read_ops = {
> .get_fd = qemu_local_get_sockfd,
> .get_buffer = qemu_local_get_buffer,
> .close = qemu_local_close,
> + .hook_ram_load = qemu_local_ram_load
> };
>
> static const QEMUFileOps pipe_write_ops = {
> -- 1.7.7.6
>
Otherwise looks good,
Paolo
next prev parent reply other threads:[~2013-10-24 14:06 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-22 3:25 [Qemu-devel] [PATCH 0/17 v2] Localhost migration with side channel for ram Lei Li
2013-10-22 3:25 ` [Qemu-devel] [PATCH 01/17] rename is_active to is_block_active Lei Li
2013-10-24 13:46 ` Paolo Bonzini
2013-10-25 4:10 ` Lei Li
2013-10-22 3:25 ` [Qemu-devel] [PATCH 02/17] QAPI: introduce magration capability unix_page_flipping Lei Li
2013-10-24 13:52 ` Paolo Bonzini
2013-10-25 4:11 ` Lei Li
2013-10-22 3:25 ` [Qemu-devel] [PATCH 03/17] migration: add migrate_unix_page_flipping() Lei Li
2013-10-24 13:54 ` Paolo Bonzini
2013-10-22 3:25 ` [Qemu-devel] [PATCH 04/17] qmp-command.hx: add missing docs for migration capabilites Lei Li
2013-10-24 13:57 ` Paolo Bonzini
2013-10-25 4:11 ` Lei Li
2013-10-22 3:25 ` [Qemu-devel] [PATCH 05/17] migration-local: add QEMUFileLocal with socket based QEMUFile Lei Li
2013-10-22 3:25 ` [Qemu-devel] [PATCH 06/17] migration-local: introduce qemu_fopen_socket_local() Lei Li
2013-10-22 3:25 ` [Qemu-devel] [PATCH 07/17] migration-local: add send_pipefd() Lei Li
2013-10-22 3:25 ` [Qemu-devel] [PATCH 08/17] migration-local: add recv_pipefd() Lei Li
2013-10-22 3:25 ` [Qemu-devel] [PATCH 09/17] migration-local: override before_ram_iterate to send pipefd Lei Li
2013-10-24 14:07 ` Paolo Bonzini
2013-10-25 4:16 ` Lei Li
2013-10-25 4:38 ` Lei Li
2013-10-25 7:23 ` Paolo Bonzini
2013-10-25 12:15 ` Lei Li
2013-10-22 3:25 ` [Qemu-devel] [PATCH 10/17] migration-local: override save_page for page transmit Lei Li
2013-10-22 3:25 ` [Qemu-devel] [PATCH 11/17] savevm: adjust ram_control_save_page for page flipping Lei Li
2013-10-24 14:09 ` Paolo Bonzini
2013-10-22 3:25 ` [Qemu-devel] [PATCH 12/17] migration-local: override hook_ram_load Lei Li
2013-10-24 14:06 ` Paolo Bonzini [this message]
2013-10-22 3:25 ` [Qemu-devel] [PATCH 13/17] migration-unix: replace qemu_fopen_socket with qemu_fopen_socket_local Lei Li
2013-10-24 14:10 ` Paolo Bonzini
2013-10-25 4:18 ` Lei Li
2013-10-22 3:25 ` [Qemu-devel] [PATCH 14/17] add new RanState RAN_STATE_FLIPPING_MIGRATE Lei Li
2013-10-22 3:51 ` Eric Blake
2013-10-22 6:28 ` Lei Li
2013-10-22 8:10 ` Eric Blake
2013-10-24 14:11 ` Paolo Bonzini
2013-10-24 14:16 ` Paolo Bonzini
2013-10-24 14:13 ` Paolo Bonzini
2013-10-25 4:30 ` Lei Li
2013-10-25 7:31 ` Paolo Bonzini
2013-10-25 12:16 ` Lei Li
2013-10-22 3:25 ` [Qemu-devel] [PATCH 15/17] migration-unix: page flipping support on unix outgoing Lei Li
2013-10-22 3:25 ` [Qemu-devel] [PATCH 16/17] migration: adjust migration_thread() process for page flipping Lei Li
2013-10-24 14:15 ` Paolo Bonzini
2013-10-25 4:33 ` Lei Li
2013-10-22 3:25 ` [Qemu-devel] [PATCH 17/17] hmp: better format for info migrate_capabilities Lei Li
2013-10-24 14:17 ` Paolo Bonzini
2013-10-24 14:17 ` [Qemu-devel] [PATCH 0/17 v2] Localhost migration with side channel for ram Paolo Bonzini
2013-10-25 5:58 ` Lei Li
2013-10-25 7:30 ` Paolo Bonzini
2013-10-25 9:12 ` Anthony Liguori
2013-10-25 12:24 ` Lei Li
2013-11-21 8:45 ` Lei Li
-- strict thread matches above, loose matches on Subject: below --
2013-11-21 9:11 [Qemu-devel] [PATCH 0/17 v3] " Lei Li
2013-11-21 9:11 ` [Qemu-devel] [PATCH 12/17] migration-local: override hook_ram_load Lei Li
2013-11-26 11:25 ` Paolo Bonzini
2013-11-26 12:11 ` Lei Li
2013-11-29 10:06 [Qemu-devel] [PATCH 0/17 v4] Localhost migration with side channel for ram Lei Li
2013-11-29 10:06 ` [Qemu-devel] [PATCH 12/17] migration-local: override hook_ram_load Lei Li
2013-12-02 9:19 [Qemu-devel] [PATCH 0/17 v5] Localhost migration with side channel for ram Lei Li
2013-12-02 9:19 ` [Qemu-devel] [PATCH 12/17] migration-local: override hook_ram_load Lei Li
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5269296C.2040206@redhat.com \
--to=pbonzini@redhat.com \
--cc=aarcange@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=lagarcia@br.ibm.com \
--cc=lilei@linux.vnet.ibm.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=mrhines@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=rcj@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.