From: Al Viro <viro@zeniv.linux.org.uk>
To: Jens Axboe <axboe@kernel.dk>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
Pavel Begunkov <asml.silence@gmail.com>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
linux-fsdevel <linux-fsdevel@vger.kernel.org>
Subject: Re: [git pull] iov_iter fixes
Date: Fri, 10 Sep 2021 16:56:28 +0000 [thread overview]
Message-ID: <YTuOPAFvGpayTBpp@zeniv-ca.linux.org.uk> (raw)
In-Reply-To: <1a61c333-680d-71a0-3849-5bfef555a49f@kernel.dk>
On Fri, Sep 10, 2021 at 10:06:25AM -0600, Jens Axboe wrote:
> Looks something like this. Not super pretty in terms of needing a define
> for this, and maybe I'm missing something, but ideally we'd want it as
> an anonymous struct that's defined inside iov_iter. Anyway, gets the
> point across. Alternatively, since we're down to just a few members now,
> we just duplicate them in each struct...
>
> Would be split into two patches, one for the iov_state addition and
> the save/restore helpers, and then one switching io_uring to use them.
> Figured we'd need some agreement on this first...
> +#define IOV_ITER_STATE \
> + size_t iov_offset; \
> + size_t count; \
> + union { \
> + unsigned long nr_segs; \
> + struct { \
> + unsigned int head; \
> + unsigned int start_head; \
> + }; \
> + loff_t xarray_start; \
> + }; \
> +
> +struct iov_iter_state {
> + IOV_ITER_STATE;
> +};
> +
> struct iov_iter {
> u8 iter_type;
> bool data_source;
> - size_t iov_offset;
> - size_t count;
> union {
> const struct iovec *iov;
> const struct kvec *kvec;
> @@ -40,12 +54,10 @@ struct iov_iter {
> struct pipe_inode_info *pipe;
> };
> union {
> - unsigned long nr_segs;
> + struct iov_iter_state state;
> struct {
> - unsigned int head;
> - unsigned int start_head;
> + IOV_ITER_STATE;
> };
> - loff_t xarray_start;
> };
> size_t truncated;
> };
No. This is impossible to read *and* wrong for flavours other than
iovec anyway.
Rules:
count is flavour-independent
iovec: iov, nr_segs, iov_offset. nr_segs + iov is constant
kvec: kvec, nr_segs, iov_offset. nr_segs + kvec is constant
bvec: bvec, nr_segs, iov_offset. nr_segs + bvec is constant
xarray: xarray, xarray_start, iov_offset. xarray and xarray_start are constant.
pipe: pipe, head, start_head, iov_offset. pipe and start_head are constant,
iov_offset can be derived from the rest.
discard: nothing.
What's more, for pipe (output-only) the situation is much trickier and
there this "reset + advance" won't work at all. Simply not applicable.
What's the point of all those contortions, anyway? You only need it for
iovec case; don't mix doing that and turning it into flavour-independent
primitive.
Especially since you turn around and access the fields of that sucker
(->count, that is) directly in your code. Keep it simple and readable,
please. We'll sort the sane flavour-independent API later. And get
rid of ->truncate, while we are at it.
next prev parent reply other threads:[~2021-09-10 16:56 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-09 4:22 [git pull] iov_iter fixes Al Viro
2021-09-09 19:37 ` Linus Torvalds
2021-09-09 21:19 ` Jens Axboe
2021-09-09 21:39 ` Jens Axboe
2021-09-09 21:56 ` Linus Torvalds
2021-09-09 22:21 ` Jens Axboe
2021-09-09 22:56 ` Linus Torvalds
2021-09-10 1:35 ` Jens Axboe
2021-09-10 2:43 ` Jens Axboe
2021-09-10 2:48 ` Al Viro
2021-09-10 3:06 ` Jens Axboe
2021-09-10 3:15 ` Al Viro
2021-09-10 3:23 ` Jens Axboe
2021-09-10 3:24 ` Al Viro
2021-09-10 3:28 ` Jens Axboe
2021-09-13 15:29 ` David Laight
2021-09-09 21:42 ` Dave Chinner
2021-09-10 2:57 ` Al Viro
2021-09-10 3:05 ` Jens Axboe
2021-09-10 3:11 ` Al Viro
2021-09-10 3:22 ` Jens Axboe
2021-09-10 3:27 ` Al Viro
2021-09-10 3:30 ` Jens Axboe
2021-09-10 3:36 ` Al Viro
2021-09-10 13:57 ` Jens Axboe
2021-09-10 14:42 ` Al Viro
2021-09-10 15:08 ` Jens Axboe
2021-09-10 15:32 ` Al Viro
2021-09-10 15:36 ` Jens Axboe
2021-09-10 15:04 ` Jens Axboe
2021-09-10 16:06 ` Jens Axboe
2021-09-10 16:44 ` Linus Torvalds
2021-09-10 16:56 ` Al Viro [this message]
2021-09-10 16:58 ` Linus Torvalds
2021-09-10 17:26 ` Jens Axboe
2021-09-10 17:31 ` Linus Torvalds
2021-09-10 17:32 ` Jens Axboe
2021-09-10 18:48 ` Al Viro
2021-09-10 19:04 ` Linus Torvalds
2021-09-10 19:10 ` Linus Torvalds
2021-09-10 19:10 ` Jens Axboe
2021-09-10 17:04 ` Jens Axboe
2021-09-09 22:54 ` Pavel Begunkov
2021-09-09 22:57 ` Pavel Begunkov
2021-09-09 23:14 ` Pavel Begunkov
2021-09-09 20:03 ` pr-tracker-bot
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=YTuOPAFvGpayTBpp@zeniv-ca.linux.org.uk \
--to=viro@zeniv.linux.org.uk \
--cc=asml.silence@gmail.com \
--cc=axboe@kernel.dk \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@linux-foundation.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.