[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 10/17] add unix_msgfd_lookup() to callback get_buffe
From: |
Lei Li |
Subject: |
[Qemu-devel] [PATCH 10/17] add unix_msgfd_lookup() to callback get_buffer |
Date: |
Fri, 29 Nov 2013 18:06:17 +0800 |
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 <address@hidden>
---
migration-local.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 56 insertions(+), 3 deletions(-)
diff --git a/migration-local.c b/migration-local.c
index 0a41c69..76ec306 100644
--- a/migration-local.c
+++ b/migration-local.c
@@ -59,16 +59,69 @@ 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) {
+ 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 (!s->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) {
+ s->pipefd_passed = 1;
+ }
+ break;
+ }
+ } else {
+ len = qemu_recv(s->sockfd, buf, size, 0);
+ if (len != -1) {
+ break;
+ }
}
if (socket_error() == EAGAIN) {
--
1.7.7.6
- [Qemu-devel] [PATCH 0/17 v4] Localhost migration with side channel for ram, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 01/17] QAPI: introduce migration capability unix_page_flipping, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 03/17] qmp-command.hx: add missing docs for migration capabilites, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 02/17] migration: add migrate_unix_page_flipping(), Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 04/17] migration-local: add QEMUFileLocal with socket based QEMUFile, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 05/17] migration-local: introduce qemu_fopen_socket_local(), Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 06/17] migration-local: add send_pipefd(), Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 07/17] save_page: replace block_offset with a MemoryRegion, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 08/17] migration-local: override save_page for page transmit, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 09/17] savevm: adjust ram_control_save_page for page flipping, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 10/17] add unix_msgfd_lookup() to callback get_buffer,
Lei Li <=
- [Qemu-devel] [PATCH 11/17] add argument ram_addr_t to hook_ram_load, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 12/17] migration-local: override hook_ram_load, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 13/17] migration-unix: replace qemu_fopen_socket with qemu_fopen_socket_local, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 14/17] add new RanState RAN_STATE_MEMORY_STALE, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 15/17] migration-unix: page flipping support on unix outgoing, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 16/17] migration: adjust migration_thread() process for page flipping, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 17/17] hmp: better format for info migrate_capabilities, Lei Li, 2013/11/29
- Re: [Qemu-devel] [PATCH 0/17 v4] Localhost migration with side channel for ram, Paolo Bonzini, 2013/11/29