Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

io_uring/net: import zc ubuf earlier

io_send_setup() already sets up the iterator for IORING_OP_SEND_ZC, we
don't need repeating that at issue time. Move it all together with mem
accounting at prep time, which is more consistent with how the non-zc
version does that.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/eb54f007c493ad9f4ca89aa8e715baf30d83fb88.1743202294.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Pavel Begunkov and committed by
Jens Axboe
fbe1a30c ad3f6cc4

+16 -28
+16 -28
io_uring/net.c
··· 1318 1318 if (unlikely(!iomsg)) 1319 1319 return -ENOMEM; 1320 1320 1321 - if (zc->flags & IORING_RECVSEND_FIXED_BUF) 1322 - iomsg->msg.sg_from_iter = io_sg_from_iter; 1323 - else 1324 - iomsg->msg.sg_from_iter = io_sg_from_iter_iovec; 1325 - 1326 1321 if (req->opcode == IORING_OP_SEND_ZC) { 1327 - req->flags |= REQ_F_IMPORT_BUFFER; 1328 - return io_send_setup(req, sqe); 1322 + if (zc->flags & IORING_RECVSEND_FIXED_BUF) 1323 + req->flags |= REQ_F_IMPORT_BUFFER; 1324 + ret = io_send_setup(req, sqe); 1325 + } else { 1326 + if (unlikely(sqe->addr2 || sqe->file_index)) 1327 + return -EINVAL; 1328 + ret = io_sendmsg_setup(req, sqe); 1329 1329 } 1330 - if (unlikely(sqe->addr2 || sqe->file_index)) 1331 - return -EINVAL; 1332 - ret = io_sendmsg_setup(req, sqe); 1333 1330 if (unlikely(ret)) 1334 1331 return ret; 1335 1332 1336 - if (!(zc->flags & IORING_RECVSEND_FIXED_BUF)) 1333 + if (!(zc->flags & IORING_RECVSEND_FIXED_BUF)) { 1334 + iomsg->msg.sg_from_iter = io_sg_from_iter_iovec; 1337 1335 return io_notif_account_mem(zc->notif, iomsg->msg.msg_iter.count); 1336 + } 1337 + iomsg->msg.sg_from_iter = io_sg_from_iter; 1338 1338 return 0; 1339 1339 } 1340 1340 ··· 1392 1392 { 1393 1393 struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg); 1394 1394 struct io_async_msghdr *kmsg = req->async_data; 1395 - int ret; 1396 1395 1397 - if (sr->flags & IORING_RECVSEND_FIXED_BUF) { 1398 - sr->notif->buf_index = req->buf_index; 1399 - ret = io_import_reg_buf(sr->notif, &kmsg->msg.msg_iter, 1400 - (u64)(uintptr_t)sr->buf, sr->len, 1401 - ITER_SOURCE, issue_flags); 1402 - if (unlikely(ret)) 1403 - return ret; 1404 - } else { 1405 - ret = import_ubuf(ITER_SOURCE, sr->buf, sr->len, &kmsg->msg.msg_iter); 1406 - if (unlikely(ret)) 1407 - return ret; 1408 - ret = io_notif_account_mem(sr->notif, sr->len); 1409 - if (unlikely(ret)) 1410 - return ret; 1411 - } 1396 + WARN_ON_ONCE(!(sr->flags & IORING_RECVSEND_FIXED_BUF)); 1412 1397 1413 - return ret; 1398 + sr->notif->buf_index = req->buf_index; 1399 + return io_import_reg_buf(sr->notif, &kmsg->msg.msg_iter, 1400 + (u64)(uintptr_t)sr->buf, sr->len, 1401 + ITER_SOURCE, issue_flags); 1414 1402 } 1415 1403 1416 1404 int io_send_zc(struct io_kiocb *req, unsigned int issue_flags)