diff mbox

[PULL,4/5] aio-posix: Skip external nodes in aio_dispatch

Message ID 1461337541-4844-5-git-send-email-kwolf@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Kevin Wolf April 22, 2016, 3:05 p.m. UTC
From: Fam Zheng <famz@redhat.com>

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 <famz@redhat.com>
Reviewed-by: Jeff Cody <jcody@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 aio-posix.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

Comments

Paolo Bonzini May 9, 2016, 10:58 a.m. UTC | #1
On 22/04/2016 17:05, Kevin Wolf wrote:
> From: Fam Zheng <famz@redhat.com>
> 
> 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 <famz@redhat.com>
> Reviewed-by: Jeff Cody <jcody@redhat.com>
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>

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;
>
diff mbox

Patch

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;