mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-10 07:00:48 +00:00
io_uring-6.2-2023-01-27
-----BEGIN PGP SIGNATURE----- iQJEBAABCAAuFiEEwPw5LcreJtl1+l5K99NY+ylx4KYFAmPULFYQHGF4Ym9lQGtl cm5lbC5kawAKCRD301j7KXHgptzKEACW+yvryJEEM7iZr4Ev7vSsYcfBLDppDR8b FCGpF/B4EtcSYseUCR0XVs1YKL734VXeLLaAqZBZ976FZQumhVlmVU6GdjF30cxI 1YWqAnHcQop1gFQG+py+ckjOCfBBwX3Phhgha8/DAzHzjH5GaCxdX6s0vjrBit36 IscNmQ3X4uzDEPor2punxmgT/815eJxipoayk/tufsoR2NTamenyCGyH6nt79jRS 4rI4FlVKbJfekI7q4XzyLJU5CzAp86z1DNjO8ACik44PkJh2HJaxoflY98dpQciT PXBR5iJtPvujkOR7HAvoi5yFcbI7qJ7it0FiuSVo2xMcJd62VPrfACDxe7DlN5NC 1nStpoJD076bQjFeITYKlRtDqSGaeVXvrhbysM+3qPuKmp9ni4h3ZnVLspMSUAHB 8G7+8AUGJbqwY2rBrXsLLOMvkM7Y5UpvtiUIIuKtLe2q/3r1EJQBYkPDkIu6G4nC IbY8Pzi6YUQ66+55LahMr29GHAsIt8DzJJedlAP+9a+a3niNew5VTl1IMdHDaDke +CItC6jJ8AR2Uom5RQnU92NBxdzza2FxPSBR89fUK0624VkPoyBuHOg3oAFjRbuP YrSSiA3UhOyuGwtrDuqBJnVbU1/U1iVeBfqyCuZNd76QmQ1JRMVBUVWKuPqqqLDK dKx6BdF4FQ== =rJIx -----END PGP SIGNATURE----- Merge tag 'io_uring-6.2-2023-01-27' of git://git.kernel.dk/linux Pull io_uring fixes from Jens Axboe: "Two small fixes for this release: - Sanitize how async prep is done for drain requests, so we ensure that it always gets done (Dylan) - A ring provided buffer recycling fix for multishot receive (me)" * tag 'io_uring-6.2-2023-01-27' of git://git.kernel.dk/linux: io_uring: always prep_async for drain requests io_uring/net: cache provided buffer group value for multishot receives
This commit is contained in:
commit
f851453bf1
@ -1765,17 +1765,12 @@ queue:
|
||||
}
|
||||
spin_unlock(&ctx->completion_lock);
|
||||
|
||||
ret = io_req_prep_async(req);
|
||||
if (ret) {
|
||||
fail:
|
||||
io_req_defer_failed(req, ret);
|
||||
return;
|
||||
}
|
||||
io_prep_async_link(req);
|
||||
de = kmalloc(sizeof(*de), GFP_KERNEL);
|
||||
if (!de) {
|
||||
ret = -ENOMEM;
|
||||
goto fail;
|
||||
io_req_defer_failed(req, ret);
|
||||
return;
|
||||
}
|
||||
|
||||
spin_lock(&ctx->completion_lock);
|
||||
@ -2048,13 +2043,16 @@ static void io_queue_sqe_fallback(struct io_kiocb *req)
|
||||
req->flags &= ~REQ_F_HARDLINK;
|
||||
req->flags |= REQ_F_LINK;
|
||||
io_req_defer_failed(req, req->cqe.res);
|
||||
} else if (unlikely(req->ctx->drain_active)) {
|
||||
io_drain_req(req);
|
||||
} else {
|
||||
int ret = io_req_prep_async(req);
|
||||
|
||||
if (unlikely(ret))
|
||||
if (unlikely(ret)) {
|
||||
io_req_defer_failed(req, ret);
|
||||
return;
|
||||
}
|
||||
|
||||
if (unlikely(req->ctx->drain_active))
|
||||
io_drain_req(req);
|
||||
else
|
||||
io_queue_iowq(req, NULL);
|
||||
}
|
||||
|
@ -62,6 +62,7 @@ struct io_sr_msg {
|
||||
u16 flags;
|
||||
/* initialised and used only by !msg send variants */
|
||||
u16 addr_len;
|
||||
u16 buf_group;
|
||||
void __user *addr;
|
||||
/* used only for send zerocopy */
|
||||
struct io_kiocb *notif;
|
||||
@ -580,6 +581,15 @@ int io_recvmsg_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
|
||||
if (req->opcode == IORING_OP_RECV && sr->len)
|
||||
return -EINVAL;
|
||||
req->flags |= REQ_F_APOLL_MULTISHOT;
|
||||
/*
|
||||
* Store the buffer group for this multishot receive separately,
|
||||
* as if we end up doing an io-wq based issue that selects a
|
||||
* buffer, it has to be committed immediately and that will
|
||||
* clear ->buf_list. This means we lose the link to the buffer
|
||||
* list, and the eventual buffer put on completion then cannot
|
||||
* restore it.
|
||||
*/
|
||||
sr->buf_group = req->buf_index;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
@ -596,6 +606,7 @@ static inline void io_recv_prep_retry(struct io_kiocb *req)
|
||||
|
||||
sr->done_io = 0;
|
||||
sr->len = 0; /* get from the provided buffer */
|
||||
req->buf_index = sr->buf_group;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user