On 8/19/21 11:26 AM, Hao Xu wrote: > 在 2021/8/19 下午11:48, Jens Axboe 写道: >> We have two checks of task->flags & PF_EXITING left: >> >> 1) In io_req_task_submit(), which is called in task_work and hence always >> in the context of the original task. That means that >> req->task == current, and hence checking ->flags is totally fine. >> >> 2) In io_poll_rewait(), where we need to stop re-arming poll to prevent >> it interfering with cancelation. Here, req->task is not necessarily >> current, and hence the check is racy. Use the ctx refs state instead >> to check if we need to cancel this request or not. > Hi Jens, > I saw cases that io_req_task_submit() and io_poll_rewait() in one > function, why one is safe and the other one not? btw, it seems both two > executes in task_work context..and task_work_add() may fail and then > work goes to system_wq, is that case safe? io_req_task_submit() is guaranteed to be run in the task that is req->task, io_poll_rewait() is not. The latter can get called from eg the poll waitqueue handling, which is not run from the task in question. -- Jens Axboe