From b70dbcf994a7403753823f2430d9cd3dee534516 Mon Sep 17 00:00:00 2001 From: aliguori Date: Thu, 13 Nov 2008 19:23:17 +0000 Subject: [PATCH] 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 Signed-off-by: Anthony Liguori git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5716 c046a42c-6fe2-441c-8c8c-71466251a162 (cherry picked from commit e20e830bbdc502986d6fd30c26b06c37a5ee0611) --- block-raw-posix.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/block-raw-posix.c b/block-raw-posix.c index 33258c9fb..0a0a7e993 100644 --- a/block-raw-posix.c +++ b/block-raw-posix.c @@ -498,15 +498,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; @@ -592,6 +594,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); -- 2.39.5