Currently request cancellations are happening before PF_EXITING is set, so it's allowed to call task_work_run(). Even though it should work as it's not it's safer to remove PF_EXITING checks.
Cc: stable@vger.kernel.org # 5.5+ Signed-off-by: Pavel Begunkov asml.silence@gmail.com --- fs/io_uring.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c index ca46f314640b..8d4fa0031e0a 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -2361,12 +2361,8 @@ static inline unsigned int io_put_rw_kbuf(struct io_kiocb *req)
static inline bool io_run_task_work(void) { - /* - * Not safe to run on exiting task, and the task_work handling will - * not add work to such a task. - */ - if (unlikely(current->flags & PF_EXITING)) - return false; + WARN_ON_ONCE(current->flags & PF_EXITING); + if (current->task_works) { __set_current_state(TASK_RUNNING); task_work_run();
On 12/30/20 2:34 PM, Pavel Begunkov wrote:
Currently request cancellations are happening before PF_EXITING is set, so it's allowed to call task_work_run(). Even though it should work as it's not it's safer to remove PF_EXITING checks.
Cc: stable@vger.kernel.org # 5.5+ Signed-off-by: Pavel Begunkov asml.silence@gmail.com
fs/io_uring.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c index ca46f314640b..8d4fa0031e0a 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -2361,12 +2361,8 @@ static inline unsigned int io_put_rw_kbuf(struct io_kiocb *req) static inline bool io_run_task_work(void) {
- /*
* Not safe to run on exiting task, and the task_work handling will
* not add work to such a task.
*/
- if (unlikely(current->flags & PF_EXITING))
return false;
- WARN_ON_ONCE(current->flags & PF_EXITING);
Should still include the return, ala:
if (WARN_ON_ONCE(current->flags & PF_EXITING)) return;
to be on the safe side, otherwise it'll crash anyway if we do hit this condition.
linux-stable-mirror@lists.linaro.org