]> git.baikalelectronics.ru Git - kernel.git/commit
io_uring: fix exiting io_req_task_work_add leaks
authorPavel Begunkov <asml.silence@gmail.com>
Thu, 1 Jul 2021 12:26:05 +0000 (13:26 +0100)
committerJens Axboe <axboe@kernel.dk>
Thu, 1 Jul 2021 19:40:32 +0000 (13:40 -0600)
commitba363ac65f8bd8fb7c5377b1d4d87e15d5ab3e91
treee0ec580f8a7b915b9368913228f2a39c43b116f7
parent2c002daba6c88b6a0e71ca75fa16ba4fef794c51
io_uring: fix exiting io_req_task_work_add leaks

If one entered io_req_task_work_add() not seeing PF_EXITING, it will set
a ->task_state bit and try task_work_add(), which may fail by that
moment. If that happens the function would try to cancel the request.

However, in a meanwhile there might come other io_req_task_work_add()
callers, which will see the bit set and leave their requests in the
list, which will never be executed.

Don't propagate an error, but clear the bit first and then fallback
all requests that we can splice from the list. The callback functions
have to be able to deal with PF_EXITING, so poll and apoll was modified
via changing io_poll_rewait().

Fixes: f7d73115def2 ("io_uring: provide FIFO ordering for task_work")
Reported-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/060002f19f1fdbd130ba24aef818ea4d3080819b.1625142209.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c