]> git.baikalelectronics.ru Git - kernel.git/commit
io_uring/net: cache provided buffer group value for multishot receives
authorJens Axboe <axboe@kernel.dk>
Sun, 22 Jan 2023 17:02:55 +0000 (10:02 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 1 Feb 2023 07:34:38 +0000 (08:34 +0100)
commit2fb2eaf79bdcd2e5e8d15a88d6943035c9361fd2
tree6124293c1df134a854c316fbb28d33d8a03ae18d
parent3ec1cdb58461ed0147c4944ea5a12e1d06be43e5
io_uring/net: cache provided buffer group value for multishot receives

commit b00c51ef8f72ced0965d021a291b98ff822c5337 upstream.

If we're using ring provided buffers with multishot receive, and we end
up doing an io-wq based issue at some points that also needs to select
a buffer, we'll lose the initially assigned buffer group as
io_ring_buffer_select() correctly clears the buffer group list as the
issue isn't serialized by the ctx uring_lock. This is fine for normal
receives as the request puts the buffer and finishes, but for multishot,
we will re-arm and do further receives. On the next trigger for this
multishot receive, the receive will try and pick from a buffer group
whose value is the same as the buffer ID of the las receive. That is
obviously incorrect, and will result in a premature -ENOUFS error for
the receive even if we had available buffers in the correct group.

Cache the buffer group value at prep time, so we can restore it for
future receives. This only needs doing for the above mentioned case, but
just do it by default to keep it easier to read.

Cc: stable@vger.kernel.org
Fixes: 276063aa4c5f ("io_uring: multishot recv")
Fixes: 8da0bea7a090 ("io_uring: support multishot in recvmsg")
Cc: Dylan Yudaken <dylany@meta.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
io_uring/net.c