qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PULL 4/5] aio-posix: Skip external nodes in aio_dispat


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PULL 4/5] aio-posix: Skip external nodes in aio_dispatch
Date: Mon, 9 May 2016 12:58:05 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.7.1


On 22/04/2016 17:05, Kevin Wolf wrote:
> From: Fam Zheng <address@hidden>
> 
> aio_poll doesn't poll the external nodes so this should never be true,
> but aio_ctx_dispatch may get notified by the events from GSource. To
> make bdrv_drained_begin effective in main loop, we should check the
> is_external flag here too.
> 
> Also do the check in aio_pending so aio_dispatch is not called
> superfluously, when there is no events other than external ones.
> 
> Signed-off-by: Fam Zheng <address@hidden>
> Reviewed-by: Jeff Cody <address@hidden>
> Signed-off-by: Kevin Wolf <address@hidden>

Are you going to do the aio-win32 version?  I'm not sure what's the
state of ioeventfd emulation.

Paolo

> ---
>  aio-posix.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/aio-posix.c b/aio-posix.c
> index 7fd565f..6006122 100644
> --- a/aio-posix.c
> +++ b/aio-posix.c
> @@ -282,10 +282,12 @@ bool aio_pending(AioContext *ctx)
>          int revents;
>  
>          revents = node->pfd.revents & node->pfd.events;
> -        if (revents & (G_IO_IN | G_IO_HUP | G_IO_ERR) && node->io_read) {
> +        if (revents & (G_IO_IN | G_IO_HUP | G_IO_ERR) && node->io_read &&
> +            aio_node_check(ctx, node->is_external)) {
>              return true;
>          }
> -        if (revents & (G_IO_OUT | G_IO_ERR) && node->io_write) {
> +        if (revents & (G_IO_OUT | G_IO_ERR) && node->io_write &&
> +            aio_node_check(ctx, node->is_external)) {
>              return true;
>          }
>      }
> @@ -323,6 +325,7 @@ bool aio_dispatch(AioContext *ctx)
>  
>          if (!node->deleted &&
>              (revents & (G_IO_IN | G_IO_HUP | G_IO_ERR)) &&
> +            aio_node_check(ctx, node->is_external) &&
>              node->io_read) {
>              node->io_read(node->opaque);
>  
> @@ -333,6 +336,7 @@ bool aio_dispatch(AioContext *ctx)
>          }
>          if (!node->deleted &&
>              (revents & (G_IO_OUT | G_IO_ERR)) &&
> +            aio_node_check(ctx, node->is_external) &&
>              node->io_write) {
>              node->io_write(node->opaque);
>              progress = true;
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]