From: "Daniel P. Berrange" <berrange@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 2/3] io: make qio_channel_yield aware of AioContexts
Date: Wed, 4 Jan 2017 17:18:23 +0000 [thread overview]
Message-ID: <20170104171823.GJ10541@redhat.com> (raw)
In-Reply-To: <20161223182641.2718-3-pbonzini@redhat.com>
On Fri, Dec 23, 2016 at 07:26:40PM +0100, Paolo Bonzini wrote:
> Support separate coroutines for reading and writing, and
> restart the coroutine on the AioContext where it was suspended on.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> include/io/channel.h | 7 +++---
> io/channel-socket.c | 12 +++++-----
> io/channel.c | 62 ++++++++++++++++++++++++++++++++++------------------
> 3 files changed, 50 insertions(+), 31 deletions(-)
>
> diff --git a/include/io/channel.h b/include/io/channel.h
> index 248bc76..3030fdb 100644
> --- a/include/io/channel.h
> +++ b/include/io/channel.h
> @@ -23,6 +23,7 @@
>
> #include "qemu-common.h"
> #include "qom/object.h"
> +#include "qemu/coroutine.h"
> #include "block/aio.h"
>
> #define TYPE_QIO_CHANNEL "qio-channel"
> @@ -59,8 +60,6 @@ typedef gboolean (*QIOChannelFunc)(QIOChannel *ioc,
> GIOCondition condition,
> gpointer data);
>
> -typedef struct QIOChannelRestart QIOChannelRestart;
> -
> /**
> * QIOChannel:
> *
> @@ -84,8 +83,8 @@ struct QIOChannel {
> unsigned int features; /* bitmask of QIOChannelFeatures */
> char *name;
> AioContext *ctx;
> - QIOChannelRestart *read_coroutine;
> - QIOChannelRestart *write_coroutine;
> + Coroutine *read_coroutine;
> + Coroutine *write_coroutine;
Seems this ought to have been squashed into the previous patch
> diff --git a/io/channel-socket.c b/io/channel-socket.c
> index 4d5f180..732ba20 100644
> --- a/io/channel-socket.c
> +++ b/io/channel-socket.c
> @@ -740,14 +740,14 @@ qio_channel_socket_shutdown(QIOChannel *ioc,
> return 0;
> }
>
> -static GSource *qio_channel_socket_set_fd_handler(QIOChannel *ioc,
> - AioContext *ctx,
> - IOHandler *io_read,
> - IOHandler *io_write,
> - void *opaque)
> +static void qio_channel_socket_set_fd_handler(QIOChannel *ioc,
> + AioContext *ctx,
> + IOHandler *io_read,
> + IOHandler *io_write,
> + void *opaque)
> {
> QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(ioc);
> - aio_set_fd_handler(ctx, sioc->fd, false, io_read, io_write, opaque);
> + aio_set_fd_handler(ctx, sioc->fd, false, io_read, io_write, NULL, opaque);
> }
And this ought to be in previous patch too.
>
> diff --git a/io/channel.c b/io/channel.c
> index 9ef683c..d4b3a5a3 100644
> --- a/io/channel.c
> +++ b/io/channel.c
> @@ -21,7 +21,7 @@
> #include "qemu/osdep.h"
> #include "io/channel.h"
> #include "qapi/error.h"
> -#include "qemu/coroutine.h"
> +#include "qemu/main-loop.h"
>
> bool qio_channel_has_feature(QIOChannel *ioc,
> QIOChannelFeature feature)
> @@ -238,22 +238,43 @@ off_t qio_channel_io_seek(QIOChannel *ioc,
> }
>
>
> -typedef struct QIOChannelYieldData QIOChannelYieldData;
> -struct QIOChannelYieldData {
> - QIOChannel *ioc;
> - Coroutine *co;
> -};
> +static void qio_channel_set_fd_handlers(QIOChannel *ioc);
> +
> +static void qio_channel_restart_read(void *opaque)
> +{
> + QIOChannel *ioc = opaque;
> + Coroutine *co = ioc->read_coroutine;
>
> + ioc->read_coroutine = NULL;
> + qio_channel_set_fd_handlers(ioc);
> + aio_co_wake(co);
> +}
>
> -static gboolean qio_channel_yield_enter(QIOChannel *ioc,
> - GIOCondition condition,
> - gpointer opaque)
> +static void qio_channel_restart_write(void *opaque)
> {
> - QIOChannelYieldData *data = opaque;
> - qemu_coroutine_enter(data->co);
> - return FALSE;
> + QIOChannel *ioc = opaque;
> + Coroutine *co = ioc->write_coroutine;
> +
> + ioc->write_coroutine = NULL;
> + qio_channel_set_fd_handlers(ioc);
> + aio_co_wake(co);
> }
>
> +static void qio_channel_set_fd_handlers(QIOChannel *ioc)
> +{
> + IOHandler *rd_handler = NULL, *wr_handler = NULL;
> +
> + if (ioc->read_coroutine) {
> + rd_handler = qio_channel_restart_read;
> + }
> + if (ioc->write_coroutine) {
> + rd_handler = qio_channel_restart_write;
> + }
> +
> + qio_channel_set_fd_handler(ioc,
> + ioc->ctx ? ioc->ctx : iohandler_get_aio_context(),
> + rd_handler, wr_handler, ioc);
> +}
ioc->read_coroutine & ioc->write_coroutine can only be non-NULL during
a qio_channel_yield() caller. So it seems that calling
qio_channel_set_fd_handlers() from the qio_channel_set_aio_context()
method in the previous patch is not required, as those two callback
pointers will always be NULL.
> @@ -272,16 +293,15 @@ void qio_channel_set_aio_context(QIOChannel *ioc,
> void coroutine_fn qio_channel_yield(QIOChannel *ioc,
> GIOCondition condition)
> {
> - QIOChannelYieldData data;
> -
> assert(qemu_in_coroutine());
> - data.ioc = ioc;
> - data.co = qemu_coroutine_self();
> - qio_channel_add_watch(ioc,
> - condition,
> - qio_channel_yield_enter,
> - &data,
> - NULL);
> + if (condition == G_IO_IN) {
> + ioc->read_coroutine = qemu_coroutine_self();
> + } else if (condition == G_IO_OUT) {
> + ioc->write_coroutine = qemu_coroutine_self();
> + } else {
> + abort();
> + }
Do we really need this to be an either/or/abort ? It looks like
the qio_channel_set_fd_handlers() method is happy top have both
read_coroutine & write_coroutine set.
If it does need to be exclusive though, can you update the API
docs for this method to mention that.
> + qio_channel_set_fd_handlers(ioc);
> qemu_coroutine_yield();
> }
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://entangle-photo.org -o- http://search.cpan.org/~danberr/ :|
next prev parent reply other threads:[~2017-01-04 17:18 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-23 18:26 [Qemu-devel] [RFC PATCH 0/3] io/nbd: AioContext support Paolo Bonzini
2016-12-23 18:26 ` [Qemu-devel] [PATCH 1/3] io: add methods to set I/O handlers on AioContext Paolo Bonzini
2017-01-04 16:45 ` Eric Blake
2017-01-04 16:56 ` Paolo Bonzini
2017-01-04 17:14 ` Daniel P. Berrange
2016-12-23 18:26 ` [Qemu-devel] [PATCH 2/3] io: make qio_channel_yield aware of AioContexts Paolo Bonzini
2017-01-04 17:18 ` Daniel P. Berrange [this message]
2017-01-04 21:26 ` Paolo Bonzini
2017-01-05 10:26 ` Daniel P. Berrange
2017-01-05 10:46 ` Paolo Bonzini
2016-12-23 18:26 ` [Qemu-devel] [PATCH 3/3] nbd: do not block on partial reply header reads Paolo Bonzini
2017-01-04 17:36 ` Eric Blake
2017-01-16 13:17 ` Stefan Hajnoczi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170104171823.GJ10541@redhat.com \
--to=berrange@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.