All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gerd Hoffmann <kraxel@redhat.com>
To: Kevin Wolf <kwolf@suse.de>
Cc: xen-devel@lists.xensource.com,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 2/2] open ptys in non-blocking mode.
Date: Fri, 18 Jul 2008 11:10:01 +0200	[thread overview]
Message-ID: <48805DE9.9050105@redhat.com> (raw)
In-Reply-To: <4880574C.1020703@suse.de>

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

Kevin Wolf wrote:
> [Crossposting to xen-devel]
> 
> Ian, we need something like this for qemu-xen (or ioemu-remote or
> whatever it's called now). Currently you must attach to the console of a
> domain, otherwise it won't boot up and keep hanging in a blocking write
> because the buffer is full.
> 
> The old ioemu had a hack in unix_write (doing a select before the write)
> which you didn't merge into qemu-xen. In fact, I noticed that you even
> removed that function entirely and I'm wondering why.

For completeness:  You also need the attached patch for unix_write,
otherwise you'll end up with qemu burning cpu cycles.  If you can't
write to a non-blocking file handle the write will instantly return with
-EAGAIN.  Calling it again of course doesn't change the result, so
better don't do that ...

-- 
http://kraxel.fedorapeople.org/xenner/

[-- Attachment #2: 0002-unix_write-don-t-block-on-non-blocking-file-handles.patch --]
[-- Type: text/x-patch, Size: 1128 bytes --]

>From d9454802fa2105bc399518eebfa1e1415ff07143 Mon Sep 17 00:00:00 2001
From: Gerd Hoffmann <kraxel@redhat.com>
Date: Wed, 9 Jul 2008 09:41:31 +0200
Subject: [PATCH 02/12] unix_write: don't block on non-blocking file handles.


Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 vl.c |   12 +++++++++++-
 1 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/vl.c b/vl.c
index c8db579..2e2d883 100644
--- a/vl.c
+++ b/vl.c
@@ -2116,14 +2116,24 @@ void socket_set_nonblock(int fd)
 
 static int unix_write(int fd, const uint8_t *buf, int len1)
 {
+    int nonblock = fcntl(fd, F_GETFL) & O_NONBLOCK;
     int ret, len;
 
     len = len1;
     while (len > 0) {
         ret = write(fd, buf, len);
         if (ret < 0) {
-            if (errno != EINTR && errno != EAGAIN)
+            if (errno == EINTR) {
+		continue;
+	    } else if (errno == EAGAIN) {
+		if (!nonblock)
+		    continue;
+		if (len1 != len)
+		    break; /* partial write, return written bytes */
+		return -1;
+	    } else {
                 return -1;
+	    }
         } else if (ret == 0) {
             break;
         } else {
-- 
1.5.4.1


WARNING: multiple messages have this Message-ID (diff)
From: Gerd Hoffmann <kraxel@redhat.com>
To: Kevin Wolf <kwolf@suse.de>
Cc: xen-devel@lists.xensource.com,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 2/2] open ptys in non-blocking mode.
Date: Fri, 18 Jul 2008 11:10:01 +0200	[thread overview]
Message-ID: <48805DE9.9050105@redhat.com> (raw)
In-Reply-To: <4880574C.1020703@suse.de>

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

Kevin Wolf wrote:
> [Crossposting to xen-devel]
> 
> Ian, we need something like this for qemu-xen (or ioemu-remote or
> whatever it's called now). Currently you must attach to the console of a
> domain, otherwise it won't boot up and keep hanging in a blocking write
> because the buffer is full.
> 
> The old ioemu had a hack in unix_write (doing a select before the write)
> which you didn't merge into qemu-xen. In fact, I noticed that you even
> removed that function entirely and I'm wondering why.

For completeness:  You also need the attached patch for unix_write,
otherwise you'll end up with qemu burning cpu cycles.  If you can't
write to a non-blocking file handle the write will instantly return with
-EAGAIN.  Calling it again of course doesn't change the result, so
better don't do that ...

-- 
http://kraxel.fedorapeople.org/xenner/

[-- Attachment #2: 0002-unix_write-don-t-block-on-non-blocking-file-handles.patch --]
[-- Type: text/x-patch, Size: 1128 bytes --]

>From d9454802fa2105bc399518eebfa1e1415ff07143 Mon Sep 17 00:00:00 2001
From: Gerd Hoffmann <kraxel@redhat.com>
Date: Wed, 9 Jul 2008 09:41:31 +0200
Subject: [PATCH 02/12] unix_write: don't block on non-blocking file handles.


Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 vl.c |   12 +++++++++++-
 1 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/vl.c b/vl.c
index c8db579..2e2d883 100644
--- a/vl.c
+++ b/vl.c
@@ -2116,14 +2116,24 @@ void socket_set_nonblock(int fd)
 
 static int unix_write(int fd, const uint8_t *buf, int len1)
 {
+    int nonblock = fcntl(fd, F_GETFL) & O_NONBLOCK;
     int ret, len;
 
     len = len1;
     while (len > 0) {
         ret = write(fd, buf, len);
         if (ret < 0) {
-            if (errno != EINTR && errno != EAGAIN)
+            if (errno == EINTR) {
+		continue;
+	    } else if (errno == EAGAIN) {
+		if (!nonblock)
+		    continue;
+		if (len1 != len)
+		    break; /* partial write, return written bytes */
+		return -1;
+	    } else {
                 return -1;
+	    }
         } else if (ret == 0) {
             break;
         } else {
-- 
1.5.4.1


[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

  reply	other threads:[~2008-07-18  9:10 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-07-09 12:19 [Qemu-devel] [PATCH 1/2] unix_write: don't block on non-blocking file handles Gerd Hoffmann
2008-07-09 12:19 ` [Qemu-devel] [PATCH 2/2] open ptys in non-blocking mode Gerd Hoffmann
2008-07-18  8:41   ` Kevin Wolf
2008-07-18  9:10     ` Gerd Hoffmann [this message]
2008-07-18  9:10       ` Gerd Hoffmann
2008-07-18  9:14       ` Kevin Wolf
2008-07-18 13:56     ` Ian Jackson
2008-07-18 13:47   ` Ian Jackson
2008-07-18 13:46 ` [Qemu-devel] [PATCH 1/2] unix_write: don't block on non-blocking file handles Ian Jackson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=48805DE9.9050105@redhat.com \
    --to=kraxel@redhat.com \
    --cc=Ian.Jackson@eu.citrix.com \
    --cc=kwolf@suse.de \
    --cc=qemu-devel@nongnu.org \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.