mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-09-18 23:09:29 +02:00
io_uring/rsrc: rename io_buffer_register_bvec()/io_buffer_unregister_bvec()
Currently, io_buffer_register_bvec() takes in a request. In preparation for supporting kernel-populated buffers in fuse io-uring (which will need to register bvecs directly, not through a struct request), rename this to io_buffer_register_request(). A subsequent patch will commandeer the "io_buffer_register_bvec()" function name to support registering bvecs directly. Rename io_buffer_unregister_bvec() to a more generic name, io_buffer_unregister(), as both io_buffer_register_request() and io_buffer_register_bvec() callers will use it for unregistration. Signed-off-by: Joanne Koong <joannelkoong@gmail.com> Reviewed-by: Caleb Sander Mateos <csander@purestorage.com> Link: https://patch.msgid.link/20260612184840.4058966-2-joannelkoong@gmail.com Signed-off-by: Jens Axboe <axboe@kernel.dk> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
This commit is contained in:
committed by
Miklos Szeredi
parent
98b4ca2378
commit
51e08eaf95
@@ -382,17 +382,17 @@ Zero copy
|
||||
---------
|
||||
|
||||
ublk zero copy relies on io_uring's fixed kernel buffer, which provides
|
||||
two APIs: `io_buffer_register_bvec()` and `io_buffer_unregister_bvec`.
|
||||
two APIs: `io_buffer_register_request()` and `io_buffer_unregister`.
|
||||
|
||||
ublk adds IO command of `UBLK_IO_REGISTER_IO_BUF` to call
|
||||
`io_buffer_register_bvec()` for ublk server to register client request
|
||||
`io_buffer_register_request()` for ublk server to register client request
|
||||
buffer into io_uring buffer table, then ublk server can submit io_uring
|
||||
IOs with the registered buffer index. IO command of `UBLK_IO_UNREGISTER_IO_BUF`
|
||||
calls `io_buffer_unregister_bvec()` to unregister the buffer, which is
|
||||
guaranteed to be live between calling `io_buffer_register_bvec()` and
|
||||
`io_buffer_unregister_bvec()`. Any io_uring operation which supports this
|
||||
kind of kernel buffer will grab one reference of the buffer until the
|
||||
operation is completed.
|
||||
calls `io_buffer_unregister()` to unregister the buffer, which is guaranteed
|
||||
to be live between calling `io_buffer_register_request()` and
|
||||
`io_buffer_unregister()`. Any io_uring operation which supports this kind of
|
||||
kernel buffer will grab one reference of the buffer until the operation is
|
||||
completed.
|
||||
|
||||
ublk server implementing zero copy or user copy has to be CAP_SYS_ADMIN and
|
||||
be trusted, because it is ublk server's responsibility to make sure IO buffer
|
||||
|
||||
+11
-11
@@ -1699,8 +1699,8 @@ ublk_auto_buf_register(const struct ublk_queue *ubq, struct request *req,
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = io_buffer_register_bvec(cmd, req, ublk_io_release,
|
||||
io->buf.auto_reg.index, issue_flags);
|
||||
ret = io_buffer_register_request(cmd, req, ublk_io_release,
|
||||
io->buf.auto_reg.index, issue_flags);
|
||||
if (ret) {
|
||||
if (io->buf.auto_reg.flags & UBLK_AUTO_BUF_REG_FALLBACK) {
|
||||
ublk_auto_buf_reg_fallback(ubq, req->tag);
|
||||
@@ -1906,7 +1906,7 @@ static noinline void ublk_batch_dispatch_fail(struct ublk_queue *ubq,
|
||||
ublk_io_unlock(io);
|
||||
|
||||
if (index != -1)
|
||||
io_buffer_unregister_bvec(data->cmd, index,
|
||||
io_buffer_unregister(data->cmd, index,
|
||||
data->issue_flags);
|
||||
}
|
||||
|
||||
@@ -3194,8 +3194,8 @@ static int ublk_register_io_buf(struct io_uring_cmd *cmd,
|
||||
if (!req)
|
||||
return -EINVAL;
|
||||
|
||||
ret = io_buffer_register_bvec(cmd, req, ublk_io_release, index,
|
||||
issue_flags);
|
||||
ret = io_buffer_register_request(cmd, req, ublk_io_release, index,
|
||||
issue_flags);
|
||||
if (ret) {
|
||||
ublk_put_req_ref(io, req);
|
||||
return ret;
|
||||
@@ -3226,8 +3226,8 @@ ublk_daemon_register_io_buf(struct io_uring_cmd *cmd,
|
||||
if (!ublk_dev_support_zero_copy(ub) || !blk_rq_has_data(req))
|
||||
return -EINVAL;
|
||||
|
||||
ret = io_buffer_register_bvec(cmd, req, ublk_io_release, index,
|
||||
issue_flags);
|
||||
ret = io_buffer_register_request(cmd, req, ublk_io_release, index,
|
||||
issue_flags);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -3242,7 +3242,7 @@ static int ublk_unregister_io_buf(struct io_uring_cmd *cmd,
|
||||
if (!(ub->dev_info.flags & UBLK_F_SUPPORT_ZERO_COPY))
|
||||
return -EINVAL;
|
||||
|
||||
return io_buffer_unregister_bvec(cmd, index, issue_flags);
|
||||
return io_buffer_unregister(cmd, index, issue_flags);
|
||||
}
|
||||
|
||||
static int ublk_check_fetch_buf(const struct ublk_device *ub, __u64 buf_addr)
|
||||
@@ -3383,7 +3383,7 @@ static int ublk_ch_uring_cmd_local(struct io_uring_cmd *cmd,
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* io_buffer_unregister_bvec() doesn't access the ubq or io,
|
||||
* io_buffer_unregister() doesn't access the ubq or io,
|
||||
* so no need to validate the q_id, tag, or task
|
||||
*/
|
||||
if (_IOC_NR(cmd_op) == UBLK_IO_UNREGISTER_IO_BUF)
|
||||
@@ -3450,7 +3450,7 @@ static int ublk_ch_uring_cmd_local(struct io_uring_cmd *cmd,
|
||||
req = ublk_fill_io_cmd(io, cmd);
|
||||
ret = ublk_config_io_buf(ub, io, cmd, addr, &buf_idx);
|
||||
if (buf_idx != UBLK_INVALID_BUF_IDX)
|
||||
io_buffer_unregister_bvec(cmd, buf_idx, issue_flags);
|
||||
io_buffer_unregister(cmd, buf_idx, issue_flags);
|
||||
compl = ublk_need_complete_req(ub, io);
|
||||
|
||||
if (req_op(req) == REQ_OP_ZONE_APPEND)
|
||||
@@ -3787,7 +3787,7 @@ static int ublk_batch_commit_io(struct ublk_queue *ubq,
|
||||
}
|
||||
|
||||
if (buf_idx != UBLK_INVALID_BUF_IDX)
|
||||
io_buffer_unregister_bvec(data->cmd, buf_idx, data->issue_flags);
|
||||
io_buffer_unregister(data->cmd, buf_idx, data->issue_flags);
|
||||
if (req_op(req) == REQ_OP_ZONE_APPEND)
|
||||
req->__sector = ublk_batch_zone_lba(uc, elem);
|
||||
if (compl)
|
||||
|
||||
@@ -91,6 +91,11 @@ struct io_br_sel io_uring_cmd_buffer_select(struct io_uring_cmd *ioucmd,
|
||||
bool io_uring_mshot_cmd_post_cqe(struct io_uring_cmd *ioucmd,
|
||||
struct io_br_sel *sel, unsigned int issue_flags);
|
||||
|
||||
int io_buffer_register_request(struct io_uring_cmd *cmd, struct request *rq,
|
||||
void (*release)(void *), unsigned int index,
|
||||
unsigned int issue_flags);
|
||||
int io_buffer_unregister(struct io_uring_cmd *cmd, unsigned int index,
|
||||
unsigned int issue_flags);
|
||||
#else
|
||||
static inline int
|
||||
io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw,
|
||||
@@ -133,6 +138,20 @@ static inline bool io_uring_mshot_cmd_post_cqe(struct io_uring_cmd *ioucmd,
|
||||
{
|
||||
return true;
|
||||
}
|
||||
static inline int io_buffer_register_request(struct io_uring_cmd *cmd,
|
||||
struct request *rq,
|
||||
void (*release)(void *),
|
||||
unsigned int index,
|
||||
unsigned int issue_flags)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
static inline int io_buffer_unregister(struct io_uring_cmd *cmd,
|
||||
unsigned int index,
|
||||
unsigned int issue_flags)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline struct io_uring_cmd *io_uring_cmd_from_tw(struct io_tw_req tw_req)
|
||||
@@ -182,10 +201,4 @@ static inline void io_uring_cmd_done32(struct io_uring_cmd *ioucmd, s32 ret,
|
||||
return __io_uring_cmd_done(ioucmd, ret, res2, issue_flags, true);
|
||||
}
|
||||
|
||||
int io_buffer_register_bvec(struct io_uring_cmd *cmd, struct request *rq,
|
||||
void (*release)(void *), unsigned int index,
|
||||
unsigned int issue_flags);
|
||||
int io_buffer_unregister_bvec(struct io_uring_cmd *cmd, unsigned int index,
|
||||
unsigned int issue_flags);
|
||||
|
||||
#endif /* _LINUX_IO_URING_CMD_H */
|
||||
|
||||
+7
-7
@@ -1015,9 +1015,9 @@ int io_sqe_buffers_register(struct io_ring_ctx *ctx, void __user *arg,
|
||||
return ret;
|
||||
}
|
||||
|
||||
int io_buffer_register_bvec(struct io_uring_cmd *cmd, struct request *rq,
|
||||
void (*release)(void *), unsigned int index,
|
||||
unsigned int issue_flags)
|
||||
int io_buffer_register_request(struct io_uring_cmd *cmd, struct request *rq,
|
||||
void (*release)(void *), unsigned int index,
|
||||
unsigned int issue_flags)
|
||||
{
|
||||
struct io_ring_ctx *ctx = cmd_to_io_kiocb(cmd)->ctx;
|
||||
struct io_rsrc_data *data = &ctx->buf_table;
|
||||
@@ -1076,10 +1076,10 @@ unlock:
|
||||
io_ring_submit_unlock(ctx, issue_flags);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(io_buffer_register_bvec);
|
||||
EXPORT_SYMBOL_GPL(io_buffer_register_request);
|
||||
|
||||
int io_buffer_unregister_bvec(struct io_uring_cmd *cmd, unsigned int index,
|
||||
unsigned int issue_flags)
|
||||
int io_buffer_unregister(struct io_uring_cmd *cmd, unsigned int index,
|
||||
unsigned int issue_flags)
|
||||
{
|
||||
struct io_ring_ctx *ctx = cmd_to_io_kiocb(cmd)->ctx;
|
||||
struct io_rsrc_data *data = &ctx->buf_table;
|
||||
@@ -1109,7 +1109,7 @@ unlock:
|
||||
io_ring_submit_unlock(ctx, issue_flags);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(io_buffer_unregister_bvec);
|
||||
EXPORT_SYMBOL_GPL(io_buffer_unregister);
|
||||
|
||||
static int validate_fixed_range(u64 buf_addr, size_t len,
|
||||
const struct io_mapped_ubuf *imu)
|
||||
|
||||
Reference in New Issue
Block a user