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