From: David Laight <david.laight.linux@gmail.com>
To: Pavel Begunkov <asml.silence@gmail.com>
Cc: "Jens Axboe" <axboe@kernel.dk>, "Keith Busch" <kbusch@kernel.org>,
"Christoph Hellwig" <hch@lst.de>,
"Sagi Grimberg" <sagi@grimberg.me>,
"Alexander Viro" <viro@zeniv.linux.org.uk>,
"Christian Brauner" <brauner@kernel.org>,
"Andrew Morton" <akpm@linux-foundation.org>,
"Sumit Semwal" <sumit.semwal@linaro.org>,
"Christian König" <christian.koenig@amd.com>,
linux-block@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-nvme@lists.infradead.org, linux-fsdevel@vger.kernel.org,
io-uring@vger.kernel.org, linux-media@vger.kernel.org,
dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org,
"Nitesh Shetty" <nj.shetty@samsung.com>,
"Kanchan Joshi" <joshi.k@samsung.com>,
"Anuj Gupta" <anuj20.g@samsung.com>,
"Tushar Gohad" <tushar.gohad@intel.com>,
"William Power" <william.power@intel.com>,
"Phil Cayton" <phil.cayton@intel.com>,
"Jason Gunthorpe" <jgg@nvidia.com>
Subject: Re: [PATCH v3 02/10] iov_iter: add iterator type for dmabuf maps
Date: Wed, 13 May 2026 11:05:57 +0100 [thread overview]
Message-ID: <20260513110557.705bdeed@pumpkin> (raw)
In-Reply-To: <20a233d2f35274817aa643cc0fe113707eb47e72.1777475843.git.asml.silence@gmail.com>
On Wed, 29 Apr 2026 16:25:48 +0100
Pavel Begunkov <asml.silence@gmail.com> wrote:
> Introduce a new iterator type for dmabuf maps. The map in an opaque
> object with internals and format specific to the subsystem / driver, and
> only it can use that subsystem / driver for issuing IO. The task of the
> middle layers is to pass the map / iterator further down, maybe doing
> basic splitting and length checking. The iterator can only be used by
> operations of the file the associated map was created for.
>
> Suggested-by: Keith Busch <kbusch@kernel.org>
> Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
> ---
> include/linux/uio.h | 11 +++++++++++
> lib/iov_iter.c | 29 +++++++++++++++++++++++------
> 2 files changed, 34 insertions(+), 6 deletions(-)
>
> diff --git a/include/linux/uio.h b/include/linux/uio.h
> index a9bc5b3067e3..75051aed70de 100644
> --- a/include/linux/uio.h
> +++ b/include/linux/uio.h
> @@ -12,6 +12,7 @@
>
> struct page;
> struct folio_queue;
> +struct io_dmabuf_map;
>
> typedef unsigned int __bitwise iov_iter_extraction_t;
>
> @@ -29,6 +30,7 @@ enum iter_type {
> ITER_FOLIOQ,
> ITER_XARRAY,
> ITER_DISCARD,
> + ITER_DMABUF_MAP,
> };
>
> #define ITER_SOURCE 1 // == WRITE
> @@ -71,6 +73,7 @@ struct iov_iter {
> const struct folio_queue *folioq;
> struct xarray *xarray;
> void __user *ubuf;
> + struct io_dmabuf_map *dmabuf_map;
> };
> size_t count;
> };
> @@ -155,6 +158,11 @@ static inline bool iov_iter_is_xarray(const struct iov_iter *i)
> return iov_iter_type(i) == ITER_XARRAY;
> }
>
> +static inline bool iov_iter_is_dmabuf_map(const struct iov_iter *i)
> +{
> + return iov_iter_type(i) == ITER_DMABUF_MAP;
> +}
> +
> static inline unsigned char iov_iter_rw(const struct iov_iter *i)
> {
> return i->data_source ? WRITE : READ;
> @@ -300,6 +308,9 @@ void iov_iter_folio_queue(struct iov_iter *i, unsigned int direction,
> unsigned int first_slot, unsigned int offset, size_t count);
> void iov_iter_xarray(struct iov_iter *i, unsigned int direction, struct xarray *xarray,
> loff_t start, size_t count);
> +void iov_iter_dmabuf_map(struct iov_iter *i, unsigned int direction,
> + struct io_dmabuf_map *map,
> + loff_t off, size_t count);
> ssize_t iov_iter_get_pages2(struct iov_iter *i, struct page **pages,
> size_t maxsize, unsigned maxpages, size_t *start);
> ssize_t iov_iter_get_pages_alloc2(struct iov_iter *i, struct page ***pages,
> diff --git a/lib/iov_iter.c b/lib/iov_iter.c
> index 243662af1af7..e2253684b991 100644
> --- a/lib/iov_iter.c
> +++ b/lib/iov_iter.c
> @@ -575,7 +575,8 @@ void iov_iter_advance(struct iov_iter *i, size_t size)
> {
> if (unlikely(i->count < size))
> size = i->count;
> - if (likely(iter_is_ubuf(i)) || unlikely(iov_iter_is_xarray(i))) {
> + if (likely(iter_is_ubuf(i)) || unlikely(iov_iter_is_xarray(i)) ||
> + unlikely(iov_iter_is_dmabuf_map(i))) {
Doesn't the extra check add more code to all the non-ubuf cases?
This could be fixed by either making iter_type a bitmask (with one bit set)
or writing an iter_is_one_of(i, ITER_xxx, ITER_yyy) define that uses
'(1 << i->iter_type) & ((1 << ITER_xxx) | ...)'
(look at the the nolibc printf code for an example).
> i->iov_offset += size;
> i->count -= size;
> } else if (likely(iter_is_iovec(i) || iov_iter_is_kvec(i))) {
> @@ -631,7 +632,8 @@ void iov_iter_revert(struct iov_iter *i, size_t unroll)
> return;
> }
> unroll -= i->iov_offset;
> - if (iov_iter_is_xarray(i) || iter_is_ubuf(i)) {
> + if (iov_iter_is_xarray(i) || iter_is_ubuf(i) ||
iter_is_ubuf() should have been first here.
-- David
> + iov_iter_is_dmabuf_map(i)) {
> BUG(); /* We should never go beyond the start of the specified
> * range since we might then be straying into pages that
> * aren't pinned.
> @@ -775,6 +777,20 @@ void iov_iter_xarray(struct iov_iter *i, unsigned int direction,
> }
> EXPORT_SYMBOL(iov_iter_xarray);
>
> +void iov_iter_dmabuf_map(struct iov_iter *i, unsigned int direction,
> + struct io_dmabuf_map *map,
> + loff_t off, size_t count)
> +{
> + WARN_ON(direction & ~(READ | WRITE));
> + *i = (struct iov_iter){
> + .iter_type = ITER_DMABUF_MAP,
> + .data_source = direction,
> + .dmabuf_map = map,
> + .count = count,
> + .iov_offset = off,
> + };
> +}
> +
> /**
> * iov_iter_discard - Initialise an I/O iterator that discards data
> * @i: The iterator to initialise.
> @@ -841,7 +857,7 @@ static unsigned long iov_iter_alignment_bvec(const struct iov_iter *i)
>
> unsigned long iov_iter_alignment(const struct iov_iter *i)
> {
> - if (likely(iter_is_ubuf(i))) {
> + if (likely(iter_is_ubuf(i)) || iov_iter_is_dmabuf_map(i)) {
> size_t size = i->count;
> if (size)
> return ((unsigned long)i->ubuf + i->iov_offset) | size;
> @@ -872,7 +888,7 @@ unsigned long iov_iter_gap_alignment(const struct iov_iter *i)
> size_t size = i->count;
> unsigned k;
>
> - if (iter_is_ubuf(i))
> + if (iter_is_ubuf(i) || iov_iter_is_dmabuf_map(i))
> return 0;
>
> if (WARN_ON(!iter_is_iovec(i)))
> @@ -1469,11 +1485,12 @@ EXPORT_SYMBOL_GPL(import_ubuf);
> void iov_iter_restore(struct iov_iter *i, struct iov_iter_state *state)
> {
> if (WARN_ON_ONCE(!iov_iter_is_bvec(i) && !iter_is_iovec(i) &&
> - !iter_is_ubuf(i)) && !iov_iter_is_kvec(i))
> + !iter_is_ubuf(i) && !iov_iter_is_kvec(i) &&
> + !iov_iter_is_dmabuf_map(i)))
> return;
> i->iov_offset = state->iov_offset;
> i->count = state->count;
> - if (iter_is_ubuf(i))
> + if (iter_is_ubuf(i) || iov_iter_is_dmabuf_map(i))
> return;
> /*
> * For the *vec iters, nr_segs + iov is constant - if we increment
next prev parent reply other threads:[~2026-05-13 10:06 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-29 15:25 [PATCH v3 00/10] Add dmabuf read/write via io_uring Pavel Begunkov
2026-04-29 15:25 ` [PATCH v3 01/10] file: add callback for creating long-term dmabuf maps Pavel Begunkov
2026-04-30 6:03 ` Christian König
2026-04-30 18:33 ` Pavel Begunkov
2026-05-04 7:14 ` Christian König
2026-05-13 8:11 ` Christoph Hellwig
2026-04-29 15:25 ` [PATCH v3 02/10] iov_iter: add iterator type for " Pavel Begunkov
2026-05-13 8:11 ` Christoph Hellwig
2026-05-13 10:05 ` David Laight [this message]
2026-05-13 13:29 ` David Laight
2026-05-18 9:24 ` Pavel Begunkov
2026-05-18 10:40 ` David Laight
2026-04-29 15:25 ` [PATCH v3 03/10] block: move bvec init into __bio_clone Pavel Begunkov
2026-05-13 8:12 ` Christoph Hellwig
2026-05-18 9:10 ` Pavel Begunkov
2026-04-29 15:25 ` [PATCH v3 04/10] block: introduce dma map backed bio type Pavel Begunkov
2026-05-13 8:19 ` Christoph Hellwig
2026-05-18 10:29 ` Pavel Begunkov
2026-05-18 12:22 ` Christian König
2026-05-18 12:40 ` Pavel Begunkov
2026-05-18 12:57 ` Christoph Hellwig
2026-05-18 13:59 ` Pavel Begunkov
2026-05-18 12:54 ` Christoph Hellwig
2026-05-19 9:21 ` David Laight
2026-05-20 8:30 ` Christoph Hellwig
2026-05-25 7:29 ` Pavel Begunkov
2026-05-13 8:39 ` Christoph Hellwig
2026-05-18 9:11 ` Pavel Begunkov
2026-04-29 15:25 ` [PATCH v3 05/10] lib: add dmabuf token infrastructure Pavel Begunkov
2026-05-13 8:24 ` Christoph Hellwig
2026-05-18 10:14 ` Pavel Begunkov
2026-05-18 12:53 ` Christoph Hellwig
2026-05-18 14:23 ` Pavel Begunkov
2026-05-19 6:56 ` Christoph Hellwig
2026-05-19 7:55 ` Pavel Begunkov
2026-05-19 9:25 ` Christoph Hellwig
2026-05-18 11:24 ` Markus Elfring
2026-05-18 14:02 ` Markus Elfring
2026-04-29 15:25 ` [PATCH v3 06/10] block: forward create_dmabuf_token to drivers Pavel Begunkov
2026-05-13 8:25 ` Christoph Hellwig
2026-05-18 9:13 ` Pavel Begunkov
2026-04-29 15:25 ` [PATCH v3 07/10] nvme-pci: implement dma_token backed requests Pavel Begunkov
2026-04-29 15:29 ` Pavel Begunkov
2026-04-29 16:07 ` Maurizio Lombardi
2026-04-30 18:18 ` Pavel Begunkov
2026-05-13 8:38 ` Christoph Hellwig
2026-05-18 9:29 ` Pavel Begunkov
2026-05-18 10:18 ` Anuj Gupta/Anuj Gupta
2026-05-18 10:30 ` Pavel Begunkov
2026-04-29 15:25 ` [PATCH v3 08/10] io_uring/rsrc: introduce buf registration structure Pavel Begunkov
2026-04-29 15:25 ` [PATCH v3 09/10] io_uring/rsrc: extend buffer update Pavel Begunkov
2026-04-29 15:25 ` [PATCH v3 10/10] io_uring/rsrc: add dmabuf backed registered buffers Pavel Begunkov
2026-05-04 15:29 ` [PATCH v3 00/10] Add dmabuf read/write via io_uring Ming Lei
2026-05-06 9:02 ` Pavel Begunkov
2026-05-07 9:50 ` Ming Lei
2026-05-12 9:30 ` Pavel Begunkov
2026-05-12 7:00 ` Christoph Hellwig
2026-05-12 9:30 ` Pavel Begunkov
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=20260513110557.705bdeed@pumpkin \
--to=david.laight.linux@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=anuj20.g@samsung.com \
--cc=asml.silence@gmail.com \
--cc=axboe@kernel.dk \
--cc=brauner@kernel.org \
--cc=christian.koenig@amd.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=hch@lst.de \
--cc=io-uring@vger.kernel.org \
--cc=jgg@nvidia.com \
--cc=joshi.k@samsung.com \
--cc=kbusch@kernel.org \
--cc=linaro-mm-sig@lists.linaro.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=nj.shetty@samsung.com \
--cc=phil.cayton@intel.com \
--cc=sagi@grimberg.me \
--cc=sumit.semwal@linaro.org \
--cc=tushar.gohad@intel.com \
--cc=viro@zeniv.linux.org.uk \
--cc=william.power@intel.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 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.