From: Joanne Koong <joannelkoong@gmail.com>
To: axboe@kernel.dk
Cc: csander@purestorage.com, asml.silence@gmail.com,
io-uring@vger.kernel.org
Subject: Re: [PATCH v1 2/5] io_uring/rsrc: split io_buffer_register_request() logic
Date: Tue, 24 Mar 2026 11:13:07 -0700 [thread overview]
Message-ID: <CAJnrk1a-yhr=MkuOBruySaxi52dVazW3GOer=uHpOZRtoKiiEQ@mail.gmail.com> (raw)
In-Reply-To: <20260324001007.1144471-3-joannelkoong@gmail.com>
On Mon, Mar 23, 2026 at 5:10 PM Joanne Koong <joannelkoong@gmail.com> wrote:
>
> Split the main initialization logic in io_buffer_register_request() into
> a helper function.
>
> This is a preparatory patch for supporting kernel-populated buffers in
> fuse io-uring, which will be reusing this logic.
>
> Signed-off-by: Joanne Koong <joannelkoong@gmail.com>
> Reviewed-by: Caleb Sander Mateos <csander@purestorage.com>
> ---
> io_uring/rsrc.c | 84 ++++++++++++++++++++++++++++++-------------------
> 1 file changed, 51 insertions(+), 33 deletions(-)
>
> diff --git a/io_uring/rsrc.c b/io_uring/rsrc.c
> index 7579f6992a25..1902ab7941ac 100644
> --- a/io_uring/rsrc.c
> +++ b/io_uring/rsrc.c
> @@ -924,64 +924,82 @@ int io_sqe_buffers_register(struct io_ring_ctx *ctx, void __user *arg,
> return ret;
> }
>
> -int io_buffer_register_request(struct io_uring_cmd *cmd, struct request *rq,
> - void (*release)(void *), unsigned int index,
> - unsigned int issue_flags)
> +static struct io_mapped_ubuf *io_kernel_buffer_init(struct io_ring_ctx *ctx,
> + unsigned int nr_bvecs,
> + unsigned int total_bytes,
> + u8 dir,
> + void (*release)(void *),
> + void *priv,
> + unsigned int index)
> {
> - struct io_ring_ctx *ctx = cmd_to_io_kiocb(cmd)->ctx;
> struct io_rsrc_data *data = &ctx->buf_table;
> - struct req_iterator rq_iter;
> struct io_mapped_ubuf *imu;
> struct io_rsrc_node *node;
> - struct bio_vec bv;
> - unsigned int nr_bvecs = 0;
> - int ret = 0;
>
> - io_ring_submit_lock(ctx, issue_flags);
> - if (index >= data->nr) {
> - ret = -EINVAL;
> - goto unlock;
> - }
> + if (index >= data->nr)
> + return ERR_PTR(-EINVAL);
> index = array_index_nospec(index, data->nr);
>
> - if (data->nodes[index]) {
> - ret = -EBUSY;
> - goto unlock;
> - }
> + if (data->nodes[index])
> + return ERR_PTR(-EBUSY);
>
> node = io_rsrc_node_alloc(ctx, IORING_RSRC_BUFFER);
> - if (!node) {
> - ret = -ENOMEM;
> - goto unlock;
> - }
> + if (!node)
> + return ERR_PTR(-ENOMEM);
>
> - /*
> - * blk_rq_nr_phys_segments() may overestimate the number of bvecs
> - * but avoids needing to iterate over the bvecs
> - */
> - imu = io_alloc_imu(ctx, blk_rq_nr_phys_segments(rq));
> + imu = io_alloc_imu(ctx, nr_bvecs);
> if (!imu) {
> kfree(node);
> - ret = -ENOMEM;
> - goto unlock;
> + return ERR_PTR(-ENOMEM);
> }
>
> imu->ubuf = 0;
> - imu->len = blk_rq_bytes(rq);
> + imu->len = total_bytes;
> imu->acct_pages = 0;
> imu->folio_shift = PAGE_SHIFT;
> + imu->nr_bvecs = nr_bvecs;
> refcount_set(&imu->refs, 1);
> imu->release = release;
> - imu->priv = rq;
> + imu->priv = priv;
> + imu->dir = 1 << dir;
I'm going to update this line to take a bitmasked dir directly so that
callers can set both dest and source if needed. I'll send out v2 with
this change.
Thanks,
Joanne
> imu->flags = IO_REGBUF_F_KBUF;
> - imu->dir = 1 << rq_data_dir(rq);
>
> + node->buf = imu;
> + data->nodes[index] = node;
> +
> + return imu;
> +}
> +
next prev parent reply other threads:[~2026-03-24 18:13 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-24 0:10 [PATCH v1 0/5] io_uring: extend bvec registration and add mem region lookup Joanne Koong
2026-03-24 0:10 ` [PATCH v1 1/5] io_uring/rsrc: rename io_buffer_register_bvec()/io_buffer_unregister_bvec() Joanne Koong
2026-03-24 0:10 ` [PATCH v1 2/5] io_uring/rsrc: split io_buffer_register_request() logic Joanne Koong
2026-03-24 18:13 ` Joanne Koong [this message]
2026-03-24 0:10 ` [PATCH v1 3/5] io_uring/rsrc: allow buffer release callback to be optional Joanne Koong
2026-03-24 0:10 ` [PATCH v1 4/5] io_uring/rsrc: add io_buffer_register_bvec() Joanne Koong
2026-03-24 0:10 ` [PATCH v1 5/5] io_uring/rsrc: add io_uring_registered_mem_region_get() Joanne Koong
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='CAJnrk1a-yhr=MkuOBruySaxi52dVazW3GOer=uHpOZRtoKiiEQ@mail.gmail.com' \
--to=joannelkoong@gmail.com \
--cc=asml.silence@gmail.com \
--cc=axboe@kernel.dk \
--cc=csander@purestorage.com \
--cc=io-uring@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox