[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 1/3] io: Yield rather than wait when already in
From: |
Daniel P. Berrange |
Subject: |
Re: [Qemu-devel] [PATCH 1/3] io: Yield rather than wait when already in coroutine |
Date: |
Wed, 6 Sep 2017 09:50:24 +0100 |
User-agent: |
Mutt/1.8.3 (2017-05-23) |
On Tue, Sep 05, 2017 at 02:11:12PM -0500, Eric Blake wrote:
> 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 new coroutine under the hood (so it is the new entry point that
> yields as needed); but if we are already in a coroutine (at which
qio_channel_wait doesn't spawn any coroutine - it simply rnus a
nested event loop to wait for the channel...
> 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 new one.
...none the less, I think this is ok.
>
> 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) {
Acked-by: Daniel P. Berrange <address@hidden>
Regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
- [Qemu-devel] [PATCH 0/3] nbd: Use common read/write-all qio functions, Eric Blake, 2017/09/05
- [Qemu-devel] [PATCH 1/3] io: Yield rather than wait when already in coroutine, Eric Blake, 2017/09/05
- Re: [Qemu-devel] [PATCH 1/3] io: Yield rather than wait when already in coroutine,
Daniel P. Berrange <=
- [Qemu-devel] [PATCH 2/3] io: Add new qio_channel_read{, v}_all_eof functions, Eric Blake, 2017/09/05
- [Qemu-devel] [PATCH 3/3] nbd: Use new qio_channel_*_all() functions, Eric Blake, 2017/09/05
- Re: [Qemu-devel] [PATCH 0/3] nbd: Use common read/write-all qio functions, Eric Blake, 2017/09/06