[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: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCH 1/3] io: Yield rather than wait when already in coroutine |
Date: |
Wed, 6 Sep 2017 16:53:43 +0200 |
Il 06 set 2017 10:51 AM, "Daniel P. Berrange" <address@hidden> ha
scritto:
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.
Great, this works for me on the pr-helper too.
Paolo
>
> 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
:|