aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>2008-11-13 19:23:17 +0000
committeraliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>2008-11-13 19:23:17 +0000
commite20e830bbdc502986d6fd30c26b06c37a5ee0611 (patch)
tree40c7cb86c63295ac5b9bcdbb31e14f2770a35d29
parent984b51814712ae4337b9e908da8a03166e2b7289 (diff)
block: make raw aio signaling non-blocking (Gerd Hoffman)
This patch switches the read handle of the signaling pipe into non-blocking mode. This avoids unwanted blocking reads and also allows to read all bytes out of the signaling pipe in case we got signaled more that once before the handler ran. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5716 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r--block-raw-posix.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/block-raw-posix.c b/block-raw-posix.c
index c06e38d12..0a06a12fb 100644
--- a/block-raw-posix.c
+++ b/block-raw-posix.c
@@ -497,15 +497,17 @@ static void posix_aio_read(void *opaque)
int ret;
ssize_t len;
- do {
- char byte;
+ /* read all bytes from signal pipe */
+ for (;;) {
+ char bytes[16];
- len = read(s->rfd, &byte, 1);
+ len = read(s->rfd, bytes, sizeof(bytes));
if (len == -1 && errno == EINTR)
- continue;
- if (len == -1 && errno == EAGAIN)
- break;
- } while (len == -1);
+ continue; /* try again */
+ if (len == sizeof(bytes))
+ continue; /* more to read */
+ break;
+ }
for(;;) {
pacb = &s->first_aio;
@@ -591,6 +593,7 @@ static int posix_aio_init(void)
s->rfd = fds[0];
s->wfd = fds[1];
+ fcntl(s->rfd, F_SETFL, O_NONBLOCK);
fcntl(s->wfd, F_SETFL, O_NONBLOCK);
qemu_aio_set_fd_handler(s->rfd, posix_aio_read, NULL, posix_aio_flush, s);