Enable IORING_SEND_VECTORIZED with registered buffers for IORING_OP_SEND_ZC. Set IORING_SEND_VECTORIZED for all msg send requests to differentiate if the vectorised version is expected. Signed-off-by: Pavel Begunkov --- io_uring/net.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/io_uring/net.c b/io_uring/net.c index 3e6112beea88..3e68593e8164 100644 --- a/io_uring/net.c +++ b/io_uring/net.c @@ -375,10 +375,13 @@ static int io_send_setup(struct io_kiocb *req, const struct io_uring_sqe *sqe) kmsg->msg.msg_namelen = addr_len; } if (sr->flags & IORING_RECVSEND_FIXED_BUF) { - if (sr->flags & IORING_SEND_VECTORIZED) - return -EINVAL; - req->flags |= REQ_F_IMPORT_BUFFER; - return 0; + if (!(sr->flags & IORING_SEND_VECTORIZED)) { + req->flags |= REQ_F_IMPORT_BUFFER; + return 0; + } + + kmsg->msg.msg_iter.nr_segs = sr->len; + return io_prep_reg_iovec(req, &kmsg->vec, sr->buf, sr->len); } if (req->flags & REQ_F_BUFFER_SELECT) return 0; @@ -396,6 +399,7 @@ static int io_sendmsg_setup(struct io_kiocb *req, const struct io_uring_sqe *sqe struct user_msghdr msg; int ret; + sr->flags |= IORING_SEND_VECTORIZED; sr->umsg = u64_to_user_ptr(READ_ONCE(sqe->addr)); ret = io_msg_copy_hdr(req, kmsg, &msg, ITER_SOURCE, NULL); if (unlikely(ret)) @@ -1453,7 +1457,7 @@ static int io_send_zc_import(struct io_kiocb *req, notif->buf_index = req->buf_index; - if (req->opcode == IORING_OP_SEND_ZC) { + if (!(sr->flags & IORING_SEND_VECTORIZED)) { ret = io_import_reg_buf(notif, &kmsg->msg.msg_iter, (u64)(uintptr_t)sr->buf, sr->len, ITER_SOURCE, issue_flags); -- 2.53.0