From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55673) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VlGr1-0005SG-8J for qemu-devel@nongnu.org; Tue, 26 Nov 2013 06:31:04 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VlGqr-0001OU-Tr for qemu-devel@nongnu.org; Tue, 26 Nov 2013 06:30:55 -0500 Received: from e23smtp04.au.ibm.com ([202.81.31.146]:39880) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VlGqr-0001O0-72 for qemu-devel@nongnu.org; Tue, 26 Nov 2013 06:30:45 -0500 Received: from /spool/local by e23smtp04.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 26 Nov 2013 21:30:40 +1000 Received: from d23relay04.au.ibm.com (d23relay04.au.ibm.com [9.190.234.120]) by d23dlp03.au.ibm.com (Postfix) with ESMTP id 7FDA33578053 for ; Tue, 26 Nov 2013 22:30:37 +1100 (EST) Received: from d23av03.au.ibm.com (d23av03.au.ibm.com [9.190.234.97]) by d23relay04.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id rAQBCgth3670302 for ; Tue, 26 Nov 2013 22:12:43 +1100 Received: from d23av03.au.ibm.com (localhost [127.0.0.1]) by d23av03.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id rAQBUZwK000865 for ; Tue, 26 Nov 2013 22:30:35 +1100 Message-ID: <52948656.4030108@linux.vnet.ibm.com> Date: Tue, 26 Nov 2013 19:30:30 +0800 From: Lei Li MIME-Version: 1.0 References: <1385025100-3191-1-git-send-email-lilei@linux.vnet.ibm.com> <1385025100-3191-9-git-send-email-lilei@linux.vnet.ibm.com> In-Reply-To: <1385025100-3191-9-git-send-email-lilei@linux.vnet.ibm.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 08/17] add unix_msgfd_lookup() to callback get_buffer List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: aarcange@redhat.com, Lei Li , quintela@redhat.com, mdroth@linux.vnet.ibm.com, mrhines@linux.vnet.ibm.com, aliguori@amazon.com, lagarcia@br.ibm.com, "pbonzini@redhat.com >> Paolo Bonzini" , rcj@linux.vnet.ibm.com On 11/21/2013 05:11 PM, Lei Li wrote: > The control message for exchange of pipe file descriptor should > be received by recvmsg, and it might be eaten to stream file by > qemu_recv() when receiving by two callbacks. So this patch adds > unix_msgfd_lookup() to callback get_buffer as the only one receiver, > where the pipe file descriptor would be caughted. > > Signed-off-by: Lei Li > --- > migration-local.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++-- > 1 files changed, 65 insertions(+), 3 deletions(-) > > diff --git a/migration-local.c b/migration-local.c > index e028beb..0f0896b 100644 > --- a/migration-local.c > +++ b/migration-local.c > @@ -50,6 +50,8 @@ typedef struct QEMUFileLocal { > bool unix_page_flipping; > } QEMUFileLocal; > > +static bool pipefd_passed; > + > static int qemu_local_get_sockfd(void *opaque) > { > QEMUFileLocal *s = opaque; > @@ -57,16 +59,76 @@ static int qemu_local_get_sockfd(void *opaque) > return s->sockfd; > } > > +static int unix_msgfd_lookup(void *opaque, struct msghdr *msg) > +{ > + QEMUFileLocal *s = opaque; > + struct cmsghdr *cmsg; > + bool found = false; > + > + for (cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) { > + if (cmsg->cmsg_len != CMSG_LEN(sizeof(int)) || > + cmsg->cmsg_level != SOL_SOCKET || > + cmsg->cmsg_type != SCM_RIGHTS) > + continue; > + > + /* PIPE file descriptor to be received */ > + s->pipefd[0] = *((int *)CMSG_DATA(cmsg)); > + } > + > + if (s->pipefd[0] <= 0) { And this should be if (s->pipefd[0] < 0).. > + fprintf(stderr, "no pipe fd can be received\n"); > + return found; > + } > + > + DPRINTF("pipefd successfully received\n"); > + return s->pipefd[0]; > +} > + > static int qemu_local_get_buffer(void *opaque, uint8_t *buf, > int64_t pos, int size) > { > QEMUFileLocal *s = opaque; > ssize_t len; > + struct msghdr msg = { NULL, }; > + struct iovec iov[1]; > + union { > + struct cmsghdr cmsg; > + char control[CMSG_SPACE(sizeof(int))]; > + } msg_control; > + > + iov[0].iov_base = buf; > + iov[0].iov_len = size; > + > + msg.msg_iov = iov; > + msg.msg_iovlen = 1; > + msg.msg_control = &msg_control; > + msg.msg_controllen = sizeof(msg_control); > > for (;;) { > - len = qemu_recv(s->sockfd, buf, size, 0); > - if (len != -1) { > - break; > + if (!pipefd_passed) { > + /* > + * recvmsg is called here to catch the control message for > + * the exchange of PIPE file descriptor until it is received. > + */ > + len = recvmsg(s->sockfd, &msg, 0); > + if (len != -1) { > + if (unix_msgfd_lookup(s, &msg) > 0) { > + pipefd_passed = 1; > + /* > + * Do not count one byte taken by the PIPE file > + * descriptor. > + */ > + len--; > + } else { > + len = -1; > + } Just found that this 'else' should go away as it will break the normal Unix migration since pipefd_passed will always be 0 for it. I have fixed this in my code, seems I mis-send it for some reason, sorry for this...:-[ > + break; > + } > + } else { > + len = qemu_recv(s->sockfd, buf, size, 0); > + if (len != -1) { > + break; > + } > } > > if (socket_error() == EAGAIN) { -- Lei