qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [patch] block: make raw aio signaling non-blocking.
@ 2008-11-13 16:18 Gerd Hoffmann
  2008-11-13 19:23 ` Anthony Liguori
  0 siblings, 1 reply; 2+ messages in thread
From: Gerd Hoffmann @ 2008-11-13 16:18 UTC (permalink / raw)
  To: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 266 bytes --]

  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


[-- Attachment #2: 0049-block-make-raw-aio-signaling-non-blocking.patch --]
[-- Type: text/plain, Size: 1652 bytes --]

>From 2b75aad0848fb231a0b942bd768f1e84462d1525 Mon Sep 17 00:00:00 2001
From: Gerd Hoffmann <kraxel@redhat.com>
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.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 block-raw-posix.c |   17 ++++++++++-------
 1 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/block-raw-posix.c b/block-raw-posix.c
index c06e38d..0a06a12 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);
-- 
1.5.6.5


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [Qemu-devel] [patch] block: make raw aio signaling non-blocking.
  2008-11-13 16:18 [Qemu-devel] [patch] block: make raw aio signaling non-blocking Gerd Hoffmann
@ 2008-11-13 19:23 ` Anthony Liguori
  0 siblings, 0 replies; 2+ messages in thread
From: Anthony Liguori @ 2008-11-13 19:23 UTC (permalink / raw)
  To: qemu-devel

Gerd Hoffmann wrote:
>   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

> cheers,
>   Gerd
>
>   

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2008-11-13 19:23 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-11-13 16:18 [Qemu-devel] [patch] block: make raw aio signaling non-blocking Gerd Hoffmann
2008-11-13 19:23 ` Anthony Liguori

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).