From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33581) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1atZQ3-0005DK-Gx for qemu-devel@nongnu.org; Fri, 22 Apr 2016 07:38:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1atZQ2-0000Ku-LU for qemu-devel@nongnu.org; Fri, 22 Apr 2016 07:38:43 -0400 Date: Fri, 22 Apr 2016 13:38:34 +0200 From: Kevin Wolf Message-ID: <20160422113834.GD4237@noname.redhat.com> References: <1461322564-17440-1-git-send-email-famz@redhat.com> <1461322564-17440-5-git-send-email-famz@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1461322564-17440-5-git-send-email-famz@redhat.com> Subject: Re: [Qemu-devel] [PATCH v2 for-2.6 4/5] aio-posix: Skip external nodes in aio_dispatch List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Fam Zheng Cc: qemu-devel@nongnu.org, Stefan Hajnoczi , Jeff Cody , Max Reitz , "Michael S. Tsirkin" , Paolo Bonzini , qemu-block@nongnu.org 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 > --- > 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 >