Skip to content

Commit 24bbfb8

Browse files
committed
Merge tag 'io_uring-6.17-20250808' of git://git.kernel.dk/linux
Pull io_uring fixes from Jens Axboe: - Allow vectorized payloads for send/send-zc - like sendmsg, but without the hassle of a msghdr. - Fix for an integer wrap that should go to stable, spotted by syzbot. Nothing alarming here, as you need to be root to hit this. Nevertheless, it should get fixed. FWIW, kudos to the syzbot crew for having much nicer reproducers now, and with nicely annotated source code as well. This is particularly useful as syzbot uses the raw interface rather than liburing, historically it's been difficult to turn a syzbot reproducer into a meaningful test case. With the recent changes, not true anymore! * tag 'io_uring-6.17-20250808' of git://git.kernel.dk/linux: io_uring/memmap: cast nr_pages to size_t before shifting io_uring/net: Allow to do vectorized send
2 parents 71a0760 + 33503c0 commit 24bbfb8

File tree

3 files changed

+12
-3
lines changed

3 files changed

+12
-3
lines changed

include/uapi/linux/io_uring.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,12 +392,16 @@ enum io_uring_op {
392392
* the starting buffer ID in cqe->flags as per
393393
* usual for provided buffer usage. The buffers
394394
* will be contiguous from the starting buffer ID.
395+
*
396+
* IORING_SEND_VECTORIZED If set, SEND[_ZC] will take a pointer to a io_vec
397+
* to allow vectorized send operations.
395398
*/
396399
#define IORING_RECVSEND_POLL_FIRST (1U << 0)
397400
#define IORING_RECV_MULTISHOT (1U << 1)
398401
#define IORING_RECVSEND_FIXED_BUF (1U << 2)
399402
#define IORING_SEND_ZC_REPORT_USAGE (1U << 3)
400403
#define IORING_RECVSEND_BUNDLE (1U << 4)
404+
#define IORING_SEND_VECTORIZED (1U << 5)
401405

402406
/*
403407
* cqe.res for IORING_CQE_F_NOTIF if

io_uring/memmap.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ static int io_region_allocate_pages(struct io_ring_ctx *ctx,
156156
unsigned long mmap_offset)
157157
{
158158
gfp_t gfp = GFP_KERNEL_ACCOUNT | __GFP_ZERO | __GFP_NOWARN;
159-
unsigned long size = mr->nr_pages << PAGE_SHIFT;
159+
size_t size = (size_t) mr->nr_pages << PAGE_SHIFT;
160160
unsigned long nr_allocated;
161161
struct page **pages;
162162
void *p;

io_uring/net.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,10 @@ static int io_send_setup(struct io_kiocb *req, const struct io_uring_sqe *sqe)
382382
}
383383
if (req->flags & REQ_F_BUFFER_SELECT)
384384
return 0;
385+
386+
if (sr->flags & IORING_SEND_VECTORIZED)
387+
return io_net_import_vec(req, kmsg, sr->buf, sr->len, ITER_SOURCE);
388+
385389
return import_ubuf(ITER_SOURCE, sr->buf, sr->len, &kmsg->msg.msg_iter);
386390
}
387391

@@ -409,7 +413,7 @@ static int io_sendmsg_setup(struct io_kiocb *req, const struct io_uring_sqe *sqe
409413
return io_net_import_vec(req, kmsg, msg.msg_iov, msg.msg_iovlen, ITER_SOURCE);
410414
}
411415

412-
#define SENDMSG_FLAGS (IORING_RECVSEND_POLL_FIRST | IORING_RECVSEND_BUNDLE)
416+
#define SENDMSG_FLAGS (IORING_RECVSEND_POLL_FIRST | IORING_RECVSEND_BUNDLE | IORING_SEND_VECTORIZED)
413417

414418
int io_sendmsg_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
415419
{
@@ -1318,7 +1322,8 @@ void io_send_zc_cleanup(struct io_kiocb *req)
13181322
}
13191323

13201324
#define IO_ZC_FLAGS_COMMON (IORING_RECVSEND_POLL_FIRST | IORING_RECVSEND_FIXED_BUF)
1321-
#define IO_ZC_FLAGS_VALID (IO_ZC_FLAGS_COMMON | IORING_SEND_ZC_REPORT_USAGE)
1325+
#define IO_ZC_FLAGS_VALID (IO_ZC_FLAGS_COMMON | IORING_SEND_ZC_REPORT_USAGE | \
1326+
IORING_SEND_VECTORIZED)
13221327

13231328
int io_send_zc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
13241329
{

0 commit comments

Comments
 (0)