Keep reading from eventfd until it's empty and aggregate the results.

Only really important when we're emulating eventfd using a pipe as
in that case we may have multiple "1" values queued up, potentially
leading to the pipe buffer filling up and the write side blocking.

Signed-off-by: Mark McLoughlin <[EMAIL PROTECTED]>
---
 qemu/compatfd.c |   21 ++++++++++++++++++++-
 1 files changed, 20 insertions(+), 1 deletions(-)

diff --git a/qemu/compatfd.c b/qemu/compatfd.c
index 7e3e7f7..2da6dd6 100644
--- a/qemu/compatfd.c
+++ b/qemu/compatfd.c
@@ -153,7 +153,7 @@ int qemu_eventfd_write(int eventfd, uint64_t value)
     return offset == 8 ? 0 : -1;
 }
 
-uint64_t qemu_eventfd_read(int eventfd)
+static uint64_t qemu_eventfd_read_one(int eventfd)
 {
     char buffer[8];
     size_t offset = 0;
@@ -177,3 +177,22 @@ uint64_t qemu_eventfd_read(int eventfd)
 
     return value;
 }
+
+uint64_t qemu_eventfd_read(int eventfd)
+{
+    uint64_t ret;
+    fd_set fds;
+    struct timeval tv;
+
+    FD_ZERO(&fds);
+    FD_SET(eventfd, &fds);
+
+    tv.tv_sec = tv.tv_usec = 0;
+
+    ret = 0;
+    do {
+        ret += qemu_eventfd_read_one(eventfd);
+    } while (select(eventfd + 1, &fds, NULL, NULL, &tv) > 0);
+
+    return ret;
+}
-- 
1.5.4.3

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to