Skip to content

Commit b419bed

Browse files
committed
io_uring/rsrc: ensure segments counts are correct on kbuf buffers
kbuf imports have the front offset adjusted and segments removed, but the tail segments are still included in the segment count that gets passed in the iov_iter. As the segments aren't necessarily all the same size, move importing to a separate helper and iterate the mapped length to get an exact count. Reviewed-by: Nitesh Shetty <nj.shetty@samsung.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent 80c7378 commit b419bed

File tree

1 file changed

+22
-5
lines changed

1 file changed

+22
-5
lines changed

io_uring/rsrc.c

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,6 +1032,26 @@ static int validate_fixed_range(u64 buf_addr, size_t len,
10321032
return 0;
10331033
}
10341034

1035+
static int io_import_kbuf(int ddir, struct iov_iter *iter,
1036+
struct io_mapped_ubuf *imu, size_t len, size_t offset)
1037+
{
1038+
size_t count = len + offset;
1039+
1040+
iov_iter_bvec(iter, ddir, imu->bvec, imu->nr_bvecs, count);
1041+
iov_iter_advance(iter, offset);
1042+
1043+
if (count < imu->len) {
1044+
const struct bio_vec *bvec = iter->bvec;
1045+
1046+
while (len > bvec->bv_len) {
1047+
len -= bvec->bv_len;
1048+
bvec++;
1049+
}
1050+
iter->nr_segs = 1 + bvec - iter->bvec;
1051+
}
1052+
return 0;
1053+
}
1054+
10351055
static int io_import_fixed(int ddir, struct iov_iter *iter,
10361056
struct io_mapped_ubuf *imu,
10371057
u64 buf_addr, size_t len)
@@ -1052,11 +1072,8 @@ static int io_import_fixed(int ddir, struct iov_iter *iter,
10521072

10531073
offset = buf_addr - imu->ubuf;
10541074

1055-
if (imu->is_kbuf) {
1056-
iov_iter_bvec(iter, ddir, imu->bvec, imu->nr_bvecs, offset + len);
1057-
iov_iter_advance(iter, offset);
1058-
return 0;
1059-
}
1075+
if (imu->is_kbuf)
1076+
return io_import_kbuf(ddir, iter, imu, len, offset);
10601077

10611078
/*
10621079
* Don't use iov_iter_advance() here, as it's really slow for

0 commit comments

Comments
 (0)