[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-block] [PATCH 04/12] io: Make qio_channel_yield() interruptibl
From: |
Kevin Wolf |
Subject: |
Re: [Qemu-block] [PATCH 04/12] io: Make qio_channel_yield() interruptible |
Date: |
Tue, 19 Feb 2019 11:24:00 +0100 |
User-agent: |
Mutt/1.10.1 (2018-07-13) |
Am 18.02.2019 um 18:11 hat Paolo Bonzini geschrieben:
> On 18/02/19 17:18, Kevin Wolf wrote:
> > Similar to how qemu_co_sleep_ns() allows to be preempted by an external
> > coroutine entry, allow reentering qio_channel_yield() early.
> >
> > Signed-off-by: Kevin Wolf <address@hidden>
> > ---
> > include/io/channel.h | 9 ++++++---
> > io/channel.c | 10 ++++++++++
> > 2 files changed, 16 insertions(+), 3 deletions(-)
> >
> > diff --git a/include/io/channel.h b/include/io/channel.h
> > index da2f138200..59460cb1ec 100644
> > --- a/include/io/channel.h
> > +++ b/include/io/channel.h
> > @@ -739,10 +739,13 @@ void qio_channel_detach_aio_context(QIOChannel *ioc);
> > * addition, no two coroutine can be waiting on the same condition
> > * and channel at the same time.
> > *
> > - * This must only be called from coroutine context
> > + * This must only be called from coroutine context. It is safe to
> > + * reenter the coroutine externally while it is waiting; in this
> > + * case the function will return even if @condition is not yet
> > + * available.
> > */
> > -void qio_channel_yield(QIOChannel *ioc,
> > - GIOCondition condition);
> > +void coroutine_fn qio_channel_yield(QIOChannel *ioc,
> > + GIOCondition condition);
> >
> > /**
> > * qio_channel_wait:
> > diff --git a/io/channel.c b/io/channel.c
> > index 8dd0684f5d..303376e08d 100644
> > --- a/io/channel.c
> > +++ b/io/channel.c
> > @@ -469,6 +469,16 @@ void coroutine_fn qio_channel_yield(QIOChannel *ioc,
> > }
> > qio_channel_set_aio_fd_handlers(ioc);
> > qemu_coroutine_yield();
> > +
> > + /* Allow interrupting the operation by reentering the coroutine other
> > than
> > + * through the aio_fd_handlers. */
> > + if (condition == G_IO_IN && ioc->read_coroutine) {
> > + ioc->read_coroutine = NULL;
> > + qio_channel_set_aio_fd_handlers(ioc);
> > + } else if (condition == G_IO_OUT && ioc->write_coroutine) {
> > + ioc->write_coroutine = NULL;
> > + qio_channel_set_aio_fd_handlers(ioc);
> > + }
> > }
>
> Perhaps it's a bit cleaner to remove the ioc->..._coroutine assignments,
> and the call to qio_channel_set_aio_fd_handlers, from
> qio_channel_restart_read and qio_channel_restart_write.
I wasn't sure if this was correct because aio_co_wake() doesn't
necessarily enter the coroutine immediately, so the value between there
and actually entering the coroutine would change compared to the old
state.
On closer look, these handlers are never in coroutine context, and
qio_channel_attach_aio_context() asserts that the handlers are inactive,
so I guess we could replace the aio_co_wake() with a direct
qemu_coroutine_enter() and possibly an assertion that we're already in
the right AioContext.
That would make it obvious that removing the assignment and call to
qio_channel_set_aio_fd_handlers() there is safe.
In any case, I think this needs to be a separate patch where the commit
message can explain the above.
Kevin
- [Qemu-block] [PATCH 00/12] block: bdrv_set_aio_context() related fixes, Kevin Wolf, 2019/02/18
- [Qemu-block] [PATCH 01/12] block-backend: Make blk_inc/dec_in_flight public, Kevin Wolf, 2019/02/18
- [Qemu-block] [PATCH 02/12] virtio-blk: Increase in_flight for request restart BH, Kevin Wolf, 2019/02/18
- [Qemu-block] [PATCH 05/12] nbd: Move nbd_read_eof() to nbd/client.c, Kevin Wolf, 2019/02/18
- [Qemu-block] [PATCH 04/12] io: Make qio_channel_yield() interruptible, Kevin Wolf, 2019/02/18
- [Qemu-block] [PATCH 10/12] test-bdrv-drain: AioContext switch in drained section, Kevin Wolf, 2019/02/18
- [Qemu-block] [PATCH 03/12] nbd: Restrict connection_co reentrance, Kevin Wolf, 2019/02/18
- [Qemu-block] [PATCH 08/12] block: Don't poll in bdrv_set_aio_context(), Kevin Wolf, 2019/02/18
- [Qemu-block] [PATCH 09/12] block: Fix AioContext switch for drained node, Kevin Wolf, 2019/02/18
- [Qemu-block] [PATCH 06/12] nbd: Use low-level QIOChannel API in nbd_read_eof(), Kevin Wolf, 2019/02/18