Skip to content

Commit 33ee911

Browse files
joannekoongaxboe
authored andcommitted
io_uring/rsrc: add io_buffer_register_bvec()
Add io_buffer_register_bvec() for registering a bvec array. This is a preparatory patch for fuse-over-io-uring zero-copy. Signed-off-by: Joanne Koong <[email protected]> Reviewed-by: Caleb Sander Mateos <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jens Axboe <[email protected]>
1 parent 3679784 commit 33ee911

2 files changed

Lines changed: 48 additions & 0 deletions

File tree

include/linux/io_uring/cmd.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ bool io_uring_mshot_cmd_post_cqe(struct io_uring_cmd *ioucmd,
9494
int io_buffer_register_request(struct io_uring_cmd *cmd, struct request *rq,
9595
void (*release)(void *), unsigned int index,
9696
unsigned int issue_flags);
97+
int io_buffer_register_bvec(struct io_uring_cmd *cmd, const struct bio_vec *bvs,
98+
unsigned int nr_bvecs, void (*release)(void *),
99+
void *priv, u8 dir, unsigned int index,
100+
unsigned int issue_flags);
97101
int io_buffer_unregister(struct io_uring_cmd *cmd, unsigned int index,
98102
unsigned int issue_flags);
99103
#else
@@ -146,6 +150,15 @@ static inline int io_buffer_register_request(struct io_uring_cmd *cmd,
146150
{
147151
return -EOPNOTSUPP;
148152
}
153+
static inline int io_buffer_register_bvec(struct io_uring_cmd *cmd,
154+
const struct bio_vec *bvs,
155+
unsigned int nr_bvecs,
156+
void (*release)(void *), void *priv,
157+
u8 dir, unsigned int index,
158+
unsigned int issue_flags)
159+
{
160+
return -EOPNOTSUPP;
161+
}
149162
static inline int io_buffer_unregister(struct io_uring_cmd *cmd,
150163
unsigned int index,
151164
unsigned int issue_flags)

io_uring/rsrc.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,6 +1006,41 @@ int io_buffer_register_request(struct io_uring_cmd *cmd, struct request *rq,
10061006
}
10071007
EXPORT_SYMBOL_GPL(io_buffer_register_request);
10081008

1009+
/*
1010+
* bvs is copied internally. caller may free it on return.
1011+
*/
1012+
int io_buffer_register_bvec(struct io_uring_cmd *cmd, const struct bio_vec *bvs,
1013+
unsigned int nr_bvecs, void (*release)(void *),
1014+
void *priv, u8 dir, unsigned int index,
1015+
unsigned int issue_flags)
1016+
{
1017+
struct io_ring_ctx *ctx = cmd_to_io_kiocb(cmd)->ctx;
1018+
struct io_mapped_ubuf *imu;
1019+
struct bio_vec *bvec;
1020+
unsigned int i, total_bytes = 0;
1021+
int ret = 0;
1022+
1023+
for (i = 0; i < nr_bvecs; i++)
1024+
total_bytes += bvs[i].bv_len;
1025+
1026+
io_ring_submit_lock(ctx, issue_flags);
1027+
imu = io_kernel_buffer_init(ctx, nr_bvecs, total_bytes, dir, release,
1028+
priv, index);
1029+
if (IS_ERR(imu)) {
1030+
ret = PTR_ERR(imu);
1031+
goto unlock;
1032+
}
1033+
1034+
bvec = imu->bvec;
1035+
for (i = 0; i < nr_bvecs; i++)
1036+
bvec[i] = bvs[i];
1037+
1038+
unlock:
1039+
io_ring_submit_unlock(ctx, issue_flags);
1040+
return ret;
1041+
}
1042+
EXPORT_SYMBOL_GPL(io_buffer_register_bvec);
1043+
10091044
int io_buffer_unregister(struct io_uring_cmd *cmd, unsigned int index,
10101045
unsigned int issue_flags)
10111046
{

0 commit comments

Comments
 (0)