[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 3/5] io: Yield rather than wait when already in corou
From: |
Eric Blake |
Subject: |
[Qemu-devel] [PULL 3/5] io: Yield rather than wait when already in coroutine |
Date: |
Wed, 6 Sep 2017 10:21:09 -0500 |
The new qio_channel_{read,write}{,v}_all functions are documented
as yielding until data is available. When used on a blocking
channel, this yield is done via qio_channel_wait() which spawns
a nested event loop under the hood (so it is that secondary loop
which yields as needed); but if we are already in a coroutine (at
which point QIO_CHANNEL_ERR_BLOCK is only possible if we are a
non-blocking channel), we want to yield the current coroutine
instead of spawning a nested event loop.
Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Acked-by: Daniel P. Berrange <address@hidden>
[commit message updated]
Signed-off-by: Eric Blake <address@hidden>
---
io/channel.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/io/channel.c b/io/channel.c
index 5e8c2f0a91..9e62794cab 100644
--- a/io/channel.c
+++ b/io/channel.c
@@ -105,7 +105,11 @@ int qio_channel_readv_all(QIOChannel *ioc,
ssize_t len;
len = qio_channel_readv(ioc, local_iov, nlocal_iov, errp);
if (len == QIO_CHANNEL_ERR_BLOCK) {
- qio_channel_wait(ioc, G_IO_IN);
+ if (qemu_in_coroutine()) {
+ qio_channel_yield(ioc, G_IO_IN);
+ } else {
+ qio_channel_wait(ioc, G_IO_IN);
+ }
continue;
} else if (len < 0) {
goto cleanup;
@@ -143,7 +147,11 @@ int qio_channel_writev_all(QIOChannel *ioc,
ssize_t len;
len = qio_channel_writev(ioc, local_iov, nlocal_iov, errp);
if (len == QIO_CHANNEL_ERR_BLOCK) {
- qio_channel_wait(ioc, G_IO_OUT);
+ if (qemu_in_coroutine()) {
+ qio_channel_yield(ioc, G_IO_OUT);
+ } else {
+ qio_channel_wait(ioc, G_IO_OUT);
+ }
continue;
}
if (len < 0) {
--
2.13.5
- [Qemu-devel] [PULL 0/5] NBD patches for 2017-09-06, Eric Blake, 2017/09/06
- [Qemu-devel] [PULL 4/5] io: Add new qio_channel_read{, v}_all_eof functions, Eric Blake, 2017/09/06
- [Qemu-devel] [PULL 3/5] io: Yield rather than wait when already in coroutine,
Eric Blake <=
- [Qemu-devel] [PULL 1/5] iotests: rewrite 192 to use _launch_qemu to fix LUKS support, Eric Blake, 2017/09/06
- [Qemu-devel] [PULL 2/5] iotests: blacklist 194 with the luks driver, Eric Blake, 2017/09/06
- [Qemu-devel] [PULL 5/5] nbd: Use new qio_channel_*_all() functions, Eric Blake, 2017/09/06
- Re: [Qemu-devel] [PULL 0/5] NBD patches for 2017-09-06, Peter Maydell, 2017/09/07