Blob Blame Raw
From 5134b54a7e8941d6e6c112e03b7e85b578606fc0 Mon Sep 17 00:00:00 2001
Message-Id: <5134b54a7e8941d6e6c112e03b7e85b578606fc0.1387382496.git.minovotn@redhat.com>
In-Reply-To: <c5386144fbf09f628148101bc674e2421cdd16e3.1387382496.git.minovotn@redhat.com>
References: <c5386144fbf09f628148101bc674e2421cdd16e3.1387382496.git.minovotn@redhat.com>
From: Nigel Croxon <ncroxon@redhat.com>
Date: Thu, 14 Nov 2013 22:52:42 +0100
Subject: [PATCH 06/46] rdma: export yield_until_fd_readable()

RH-Author: Nigel Croxon <ncroxon@redhat.com>
Message-id: <1384469598-13137-7-git-send-email-ncroxon@redhat.com>
Patchwork-id: 55691
O-Subject: [RHEL7.0 PATCH 06/42] rdma: export yield_until_fd_readable()
Bugzilla: 1011720
RH-Acked-by: Orit Wasserman <owasserm@redhat.com>
RH-Acked-by: Amit Shah <amit.shah@redhat.com>
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>

Bugzilla: 1011720
https://bugzilla.redhat.com/show_bug.cgi?id=1011720

>From commit ID:
commit 9f05d0c3a4f9e8fcb13ed09cc350af45a627809a
Author: Michael R. Hines <mrhines@us.ibm.com>
Date:   Tue Jun 25 21:35:29 2013 -0400

    rdma: export yield_until_fd_readable()

    The RDMA event channel can be made non-blocking just like a TCP
    socket. Exporting this function allows us to yield so that the
    QEMU monitor remains available.

    Reviewed-by: Juan Quintela <quintela@redhat.com>
    Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
    Reviewed-by: Chegu Vinod <chegu_vinod@hp.com>
    Tested-by: Chegu Vinod <chegu_vinod@hp.com>
    Tested-by: Michael R. Hines <mrhines@us.ibm.com>
    Signed-off-by: Michael R. Hines <mrhines@us.ibm.com>
    Signed-off-by: Juan Quintela <quintela@redhat.com>
---
 include/block/coroutine.h |    6 ++++++
 qemu-coroutine-io.c       |   23 +++++++++++++++++++++++
 savevm.c                  |   28 ----------------------------
 3 files changed, 29 insertions(+), 28 deletions(-)

Signed-off-by: Michal Novotny <minovotn@redhat.com>
---
 include/block/coroutine.h |  6 ++++++
 qemu-coroutine-io.c       | 23 +++++++++++++++++++++++
 savevm.c                  | 28 ----------------------------
 3 files changed, 29 insertions(+), 28 deletions(-)

diff --git a/include/block/coroutine.h b/include/block/coroutine.h
index a978162..377805a 100644
--- a/include/block/coroutine.h
+++ b/include/block/coroutine.h
@@ -209,4 +209,10 @@ void qemu_co_rwlock_unlock(CoRwlock *lock);
  */
 void coroutine_fn co_sleep_ns(QEMUClock *clock, int64_t ns);
 
+/**
+ * Yield until a file descriptor becomes readable
+ *
+ * Note that this function clobbers the handlers for the file descriptor.
+ */
+void coroutine_fn yield_until_fd_readable(int fd);
 #endif /* QEMU_COROUTINE_H */
diff --git a/qemu-coroutine-io.c b/qemu-coroutine-io.c
index e8ad1a4..c4df35a 100644
--- a/qemu-coroutine-io.c
+++ b/qemu-coroutine-io.c
@@ -63,3 +63,26 @@ qemu_co_send_recv(int sockfd, void *buf, size_t bytes, bool do_send)
     struct iovec iov = { .iov_base = buf, .iov_len = bytes };
     return qemu_co_sendv_recvv(sockfd, &iov, 1, 0, bytes, do_send);
 }
+
+typedef struct {
+    Coroutine *co;
+    int fd;
+} FDYieldUntilData;
+
+static void fd_coroutine_enter(void *opaque)
+{
+    FDYieldUntilData *data = opaque;
+    qemu_set_fd_handler(data->fd, NULL, NULL, NULL);
+    qemu_coroutine_enter(data->co, NULL);
+}
+
+void coroutine_fn yield_until_fd_readable(int fd)
+{
+    FDYieldUntilData data;
+
+    assert(qemu_in_coroutine());
+    data.co = qemu_coroutine_self();
+    data.fd = fd;
+    qemu_set_fd_handler(fd, fd_coroutine_enter, NULL, &data);
+    qemu_coroutine_yield();
+}
diff --git a/savevm.c b/savevm.c
index f68f7f2..9304788 100644
--- a/savevm.c
+++ b/savevm.c
@@ -149,34 +149,6 @@ typedef struct QEMUFileSocket
     QEMUFile *file;
 } QEMUFileSocket;
 
-typedef struct {
-    Coroutine *co;
-    int fd;
-} FDYieldUntilData;
-
-static void fd_coroutine_enter(void *opaque)
-{
-    FDYieldUntilData *data = opaque;
-    qemu_set_fd_handler(data->fd, NULL, NULL, NULL);
-    qemu_coroutine_enter(data->co, NULL);
-}
-
-/**
- * Yield until a file descriptor becomes readable
- *
- * Note that this function clobbers the handlers for the file descriptor.
- */
-static void coroutine_fn yield_until_fd_readable(int fd)
-{
-    FDYieldUntilData data;
-
-    assert(qemu_in_coroutine());
-    data.co = qemu_coroutine_self();
-    data.fd = fd;
-    qemu_set_fd_handler(fd, fd_coroutine_enter, NULL, &data);
-    qemu_coroutine_yield();
-}
-
 static ssize_t socket_writev_buffer(void *opaque, struct iovec *iov, int iovcnt,
                                     int64_t pos)
 {
-- 
1.7.11.7