block: make raw aio signaling non-blocking.
PATCH 1/1 block: make raw aio signaling non-blocking.
Hi,
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.
cheers,
Gerd
Quoted 1 line
From
2b75aad0848fb231a0b942bd768f1e84462d1525Mon Sep 17 00:00:00 2001
From: Gerd Hoffmann <[email protected]>
Date: Thu, 13 Nov 2008 14:21:19 +0100
Subject: [PATCH] block: make raw aio signaling non-blocking.
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.
--- block-raw-posix.c | 17 ++++++++++------- 1 files changed, 10 insertions(+), 7 deletions(-)
block-raw-posix.c +10 -7
@@ -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);
Signature · 1 line
1.5.6.5
Anthony Liguori
AppliedQuoted 7 lines · Gerd Hoffmann
Hi,
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.
Applied. Thanks.
Regards,
Anthony Liguori
Quoted 4 lines
cheers,
Gerd