[PATCH 4/6] kvm: qemu: aggregate reads from eventfd

Mark McLoughlin
2008-10-30T17:53:23Z

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 <markmc@redhat.com>
---
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