From: "Daniel P. Berrangé" <berrange@redhat.com>
To: Leonardo Bras <leobras@redhat.com>
Cc: Juan Quintela <quintela@redhat.com>,
qemu-devel@nongnu.org, Peter Xu <peterx@redhat.com>,
Markus Armbruster <armbru@redhat.com>,
Eric Blake <eblake@redhat.com>,
"Dr. David Alan Gilbert" <dgilbert@redhat.com>
Subject: Re: [PATCH v7 1/5] QIOChannel: Add flags on io_writev and introduce io_flush callback
Date: Thu, 13 Jan 2022 10:52:41 +0000 [thread overview]
Message-ID: <YeAEeZ1eDKqzDSc5@redhat.com> (raw)
In-Reply-To: <20220106221341.8779-2-leobras@redhat.com>
On Thu, Jan 06, 2022 at 07:13:38PM -0300, Leonardo Bras wrote:
> Add flags to io_writev and introduce io_flush as optional callback to
> QIOChannelClass, allowing the implementation of zero copy writes by
> subclasses.
>
> How to use them:
> - Write data using qio_channel_writev(...,QIO_CHANNEL_WRITE_FLAG_ZERO_COPY),
> - Wait write completion with qio_channel_flush().
>
> Notes:
> As some zero copy implementations work asynchronously, it's
> recommended to keep the write buffer untouched until the return of
> qio_channel_flush(), to avoid the risk of sending an updated buffer
> instead of the buffer state during write.
>
> As io_flush callback is optional, if a subclass does not implement it, then:
> - io_flush will return 0 without changing anything.
>
> Also, some functions like qio_channel_writev_full_all() were adapted to
> receive a flag parameter. That allows shared code between zero copy and
> non-zero copy writev, and also an easier implementation on new flags.
>
> Signed-off-by: Leonardo Bras <leobras@redhat.com>
> ---
> include/io/channel.h | 67 +++++++++++++++++++++++++++++++++++---------
> io/channel-buffer.c | 1 +
> io/channel-command.c | 1 +
> io/channel-file.c | 1 +
> io/channel-socket.c | 2 ++
> io/channel-tls.c | 1 +
> io/channel-websock.c | 1 +
> io/channel.c | 51 +++++++++++++++++++++++----------
> migration/rdma.c | 1 +
> 9 files changed, 98 insertions(+), 28 deletions(-)
>
> diff --git a/include/io/channel.h b/include/io/channel.h
> index 88988979f8..343766ce5b 100644
> --- a/include/io/channel.h
> +++ b/include/io/channel.h
> @@ -32,12 +32,15 @@ OBJECT_DECLARE_TYPE(QIOChannel, QIOChannelClass,
>
> #define QIO_CHANNEL_ERR_BLOCK -2
>
> +#define QIO_CHANNEL_WRITE_FLAG_ZERO_COPY 0x1
> +
> typedef enum QIOChannelFeature QIOChannelFeature;
>
> enum QIOChannelFeature {
> QIO_CHANNEL_FEATURE_FD_PASS,
> QIO_CHANNEL_FEATURE_SHUTDOWN,
> QIO_CHANNEL_FEATURE_LISTEN,
> + QIO_CHANNEL_FEATURE_WRITE_ZERO_COPY,
> };
>
>
> @@ -104,6 +107,7 @@ struct QIOChannelClass {
> size_t niov,
> int *fds,
> size_t nfds,
> + int flags,
> Error **errp);
> ssize_t (*io_readv)(QIOChannel *ioc,
> const struct iovec *iov,
> @@ -136,6 +140,8 @@ struct QIOChannelClass {
> IOHandler *io_read,
> IOHandler *io_write,
> void *opaque);
> + int (*io_flush)(QIOChannel *ioc,
> + Error **errp);
> };
>
> /* General I/O handling functions */
> @@ -222,12 +228,13 @@ ssize_t qio_channel_readv_full(QIOChannel *ioc,
>
>
> /**
> - * qio_channel_writev_full:
> + * qio_channel_writev_full_flags:
> * @ioc: the channel object
> * @iov: the array of memory regions to write data from
> * @niov: the length of the @iov array
> * @fds: an array of file handles to send
> * @nfds: number of file handles in @fds
> + * @flags: write flags (QIO_CHANNEL_WRITE_FLAG_*)
> * @errp: pointer to a NULL-initialized error object
> *
> * Write data to the IO channel, reading it from the
> @@ -255,12 +262,16 @@ ssize_t qio_channel_readv_full(QIOChannel *ioc,
> * or QIO_CHANNEL_ERR_BLOCK if no data is can be sent
> * and the channel is non-blocking
> */
> -ssize_t qio_channel_writev_full(QIOChannel *ioc,
> - const struct iovec *iov,
> - size_t niov,
> - int *fds,
> - size_t nfds,
> - Error **errp);
> +ssize_t qio_channel_writev_full_flags(QIOChannel *ioc,
> + const struct iovec *iov,
> + size_t niov,
> + int *fds,
> + size_t nfds,
> + int flags,
> + Error **errp);
> +
> +#define qio_channel_writev_full(ioc, iov, niov, fds, nfds, errp) \
> + qio_channel_writev_full_flags(ioc, iov, niov, fds, nfds, 0, errp)
Don't introduce yet another API variant here. Just add flags to
all the existing write APIs with "full" in their name. The word
"full" in their name was intended to indicate that they are
accepting all possible parameters, so it doesn't mean sense to
add APIs which take even more possible parameters.
> +int qio_channel_writev_full_all_flags(QIOChannel *ioc,
> + const struct iovec *iov,
> + size_t niov,
> + int *fds, size_t nfds,
> + int flags, Error **errp);
> +#define qio_channel_writev_full_all(ioc, iov, niov, fds, nfds, errp) \
> + qio_channel_writev_full_all_flags(ioc, iov, niov, fds, nfds, 0, errp)
Same note.
> +/**
> + * qio_channel_flush:
> + * @ioc: the channel object
> + * @errp: pointer to a NULL-initialized error object
> + *
> + * Will block until every packet queued with
> + * qio_channel_writev_full_flags() + QIO_CHANNEL_WRITE_FLAG_ZERO_COPY
> + * is sent, or return in case of any error.
> + *
> + * If not implemented, acts as a no-op, and returns 0.
> + *
> + * Returns -1 if any error is found,
> + * 1 if every send failed to use zero copy.
> + * 0 otherwise.
> + */
> +
> +int qio_channel_flush(QIOChannel *ioc,
> + Error **errp);
Regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
next prev parent reply other threads:[~2022-01-13 10:55 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-06 22:13 [PATCH v7 0/5] MSG_ZEROCOPY + multifd Leonardo Bras
2022-01-06 22:13 ` [PATCH v7 1/5] QIOChannel: Add flags on io_writev and introduce io_flush callback Leonardo Bras
2022-01-13 6:28 ` Peter Xu
2022-01-18 20:45 ` Leonardo Bras Soares Passos
2022-01-19 1:58 ` Peter Xu
2022-01-19 18:29 ` Leonardo Bras Soares Passos
2022-01-13 10:52 ` Daniel P. Berrangé [this message]
2022-01-19 4:38 ` Leonardo Bras Soares Passos
2022-01-06 22:13 ` [PATCH v7 2/5] QIOChannelSocket: Implement io_writev zero copy flag & io_flush for CONFIG_LINUX Leonardo Bras
2022-01-13 6:48 ` Peter Xu
2022-01-13 10:06 ` Daniel P. Berrangé
2022-01-13 10:34 ` Peter Xu
2022-01-13 10:42 ` Daniel P. Berrangé
2022-01-13 12:12 ` Peter Xu
2022-01-19 17:23 ` Leonardo Bras Soares Passos
2022-01-19 17:22 ` Leonardo Bras Soares Passos
2022-01-20 1:28 ` Peter Xu
2022-01-19 17:16 ` Leonardo Bras Soares Passos
2022-01-19 17:01 ` Leonardo Bras Soares Passos
2022-02-01 4:23 ` Leonardo Bras Soares Passos
2022-01-13 13:05 ` Daniel P. Berrangé
2022-01-19 17:24 ` Leonardo Bras Soares Passos
2022-01-06 22:13 ` [PATCH v7 3/5] migration: Add zero-copy parameter for QMP/HMP for Linux Leonardo Bras
2022-01-13 7:00 ` Peter Xu
2022-01-19 17:53 ` Leonardo Bras Soares Passos
2022-01-13 13:09 ` Daniel P. Berrangé
2022-01-19 18:03 ` Leonardo Bras Soares Passos
2022-01-19 18:15 ` Daniel P. Berrangé
2022-01-19 18:46 ` Leonardo Bras Soares Passos
2022-02-18 16:31 ` Juan Quintela
2022-02-21 16:23 ` Leonardo Bras Soares Passos
2022-01-06 22:13 ` [PATCH v7 4/5] migration: Add migrate_use_tls() helper Leonardo Bras
2022-01-13 7:02 ` Peter Xu
2022-01-19 18:06 ` Leonardo Bras Soares Passos
2022-01-20 1:37 ` Peter Xu
2022-01-13 13:10 ` Daniel P. Berrangé
2022-01-19 18:07 ` Leonardo Bras Soares Passos
2022-01-06 22:13 ` [PATCH v7 5/5] multifd: Implement zero copy write in multifd migration (multifd-zero-copy) Leonardo Bras
2022-01-13 7:15 ` Peter Xu
2022-01-19 18:23 ` Leonardo Bras Soares Passos
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=YeAEeZ1eDKqzDSc5@redhat.com \
--to=berrange@redhat.com \
--cc=armbru@redhat.com \
--cc=dgilbert@redhat.com \
--cc=eblake@redhat.com \
--cc=leobras@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).