Message ID | 20230920222231.686275-8-dhowells@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | iov_iter: Convert the iterator macros into inline funcs | expand |
On Wed, Sep 20, 2023 at 11:22:27PM +0100, David Howells wrote: > Add an iteration function that can only iterate over kernel internal-type > iterators (ie. BVEC, KVEC, XARRAY) and not user-backed iterators (ie. UBUF > and IOVEC). This allows for smaller iterators to be built when it is known > the caller won't have a user-backed iterator. > > Signed-off-by: David Howells <dhowells@redhat.com> > cc: Alexander Viro <viro@zeniv.linux.org.uk> > cc: Jens Axboe <axboe@kernel.dk> > cc: Christoph Hellwig <hch@lst.de> > cc: Christian Brauner <christian@brauner.io> > cc: Matthew Wilcox <willy@infradead.org> > cc: Linus Torvalds <torvalds@linux-foundation.org> > cc: David Laight <David.Laight@ACULAB.COM> > cc: linux-block@vger.kernel.org > cc: linux-fsdevel@vger.kernel.org > cc: linux-mm@kvack.org > --- > include/linux/iov_iter.h | 31 +++++++++++++++++++++++++++++++ > 1 file changed, 31 insertions(+) > > diff --git a/include/linux/iov_iter.h b/include/linux/iov_iter.h > index 270454a6703d..a94d605d7386 100644 > --- a/include/linux/iov_iter.h > +++ b/include/linux/iov_iter.h > @@ -271,4 +271,35 @@ size_t iterate_and_advance(struct iov_iter *iter, size_t len, void *priv, > return iterate_and_advance2(iter, len, priv, NULL, ustep, step); > } > > +/** > + * iterate_and_advance_kernel - Iterate over a kernel iterator > + * @iter: The iterator to iterate over. > + * @len: The amount to iterate over. > + * @priv: Data for the step functions. nit: an entry for @priv2 belongs here > + * @step: Processing function; given kernel addresses. > + * > + * Like iterate_and_advance2(), but rejected UBUF and IOVEC iterators and does > + * not take a user-step function. > + */ > +static __always_inline > +size_t iterate_and_advance_kernel(struct iov_iter *iter, size_t len, void *priv, > + void *priv2, iov_step_f step) > +{ ...
diff --git a/include/linux/iov_iter.h b/include/linux/iov_iter.h index 270454a6703d..a94d605d7386 100644 --- a/include/linux/iov_iter.h +++ b/include/linux/iov_iter.h @@ -271,4 +271,35 @@ size_t iterate_and_advance(struct iov_iter *iter, size_t len, void *priv, return iterate_and_advance2(iter, len, priv, NULL, ustep, step); } +/** + * iterate_and_advance_kernel - Iterate over a kernel iterator + * @iter: The iterator to iterate over. + * @len: The amount to iterate over. + * @priv: Data for the step functions. + * @step: Processing function; given kernel addresses. + * + * Like iterate_and_advance2(), but rejected UBUF and IOVEC iterators and does + * not take a user-step function. + */ +static __always_inline +size_t iterate_and_advance_kernel(struct iov_iter *iter, size_t len, void *priv, + void *priv2, iov_step_f step) +{ + if (unlikely(iter->count < len)) + len = iter->count; + if (unlikely(!len)) + return 0; + + if (iov_iter_is_bvec(iter)) + return iterate_bvec(iter, len, priv, priv2, step); + if (iov_iter_is_kvec(iter)) + return iterate_kvec(iter, len, priv, priv2, step); + if (iov_iter_is_xarray(iter)) + return iterate_xarray(iter, len, priv, priv2, step); + if (iov_iter_is_discard(iter)) + return iterate_discard(iter, len, priv, priv2, step); + WARN_ON_ONCE(1); + return 0; +} + #endif /* _LINUX_IOV_ITER_H */
Add an iteration function that can only iterate over kernel internal-type iterators (ie. BVEC, KVEC, XARRAY) and not user-backed iterators (ie. UBUF and IOVEC). This allows for smaller iterators to be built when it is known the caller won't have a user-backed iterator. Signed-off-by: David Howells <dhowells@redhat.com> cc: Alexander Viro <viro@zeniv.linux.org.uk> cc: Jens Axboe <axboe@kernel.dk> cc: Christoph Hellwig <hch@lst.de> cc: Christian Brauner <christian@brauner.io> cc: Matthew Wilcox <willy@infradead.org> cc: Linus Torvalds <torvalds@linux-foundation.org> cc: David Laight <David.Laight@ACULAB.COM> cc: linux-block@vger.kernel.org cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- include/linux/iov_iter.h | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+)