mirror of
https://github.com/torvalds/linux.git
synced 2026-05-21 13:27:57 +02: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 @@ static __cold void io_drain_req(struct io_kiocb *req)
|
|||
}
|
||||
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…
Reference in New Issue
Block a user