diff mbox

[v2,for-2.6,4/5] aio-posix: Skip external nodes in aio_dispatch

Message ID 1461322564-17440-5-git-send-email-famz@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Fam Zheng April 22, 2016, 10:56 a.m. UTC
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.

This could result in a few busy polls because the fd is left unhandled,
but the drained section is only transient and shouldn't be longer than
one or two event loop iterations.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 aio-posix.c | 2 ++
 1 file changed, 2 insertions(+)

Comments

Kevin Wolf April 22, 2016, 11:38 a.m. UTC | #1
Am 22.04.2016 um 12:56 hat Fam Zheng geschrieben:
> 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.
> 
> This could result in a few busy polls because the fd is left unhandled,
> but the drained section is only transient and shouldn't be longer than
> one or two event loop iterations.

Are the busy polls because aio_ctx_check() calls aio_pending(), which
still returns true, even if only disabled AioHandlers are ready? If so,
should we just add the is_external check to aio_pending(), too?

Kevin

> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  aio-posix.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/aio-posix.c b/aio-posix.c
> index 7fd565f..a7c9304 100644
> --- a/aio-posix.c
> +++ b/aio-posix.c
> @@ -323,6 +323,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 +334,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;
> -- 
> 2.8.0
>
Fam Zheng April 22, 2016, 11:44 a.m. UTC | #2
On Fri, 04/22 13:38, Kevin Wolf wrote:
> Am 22.04.2016 um 12:56 hat Fam Zheng geschrieben:
> > 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.
> > 
> > This could result in a few busy polls because the fd is left unhandled,
> > but the drained section is only transient and shouldn't be longer than
> > one or two event loop iterations.
> 
> Are the busy polls because aio_ctx_check() calls aio_pending(), which
> still returns true, even if only disabled AioHandlers are ready? If so,
> should we just add the is_external check to aio_pending(), too?

Good point, that is certainly better! Will add that.

Fam

> 
> Kevin
> 
> > Signed-off-by: Fam Zheng <famz@redhat.com>
> > ---
> >  aio-posix.c | 2 ++
> >  1 file changed, 2 insertions(+)
> > 
> > diff --git a/aio-posix.c b/aio-posix.c
> > index 7fd565f..a7c9304 100644
> > --- a/aio-posix.c
> > +++ b/aio-posix.c
> > @@ -323,6 +323,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 +334,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;
> > -- 
> > 2.8.0
> >
diff mbox

Patch

diff --git a/aio-posix.c b/aio-posix.c
index 7fd565f..a7c9304 100644
--- a/aio-posix.c
+++ b/aio-posix.c
@@ -323,6 +323,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 +334,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;