On 8/9/21 5:50 AM, Nadav Amit wrote: >> On Aug 8, 2021, at 9:07 PM, Hao Xu <haoxu@xxxxxxxxxxxxxxxxx> wrote: >> 在 2021/8/9 上午1:31, Nadav Amit 写道: >>>> On Aug 8, 2021, at 5:55 AM, Pavel Begunkov <asml.silence@xxxxxxxxx> wrote: >>>> On 8/8/21 1:13 AM, Nadav Amit wrote: >>>>> From: Nadav Amit <namit@xxxxxxxxxx> >>>>> >>>>> When using SQPOLL, the submission queue polling thread calls >>>>> task_work_run() to run queued work. However, when work is added with >>>>> TWA_SIGNAL - as done by io_uring itself - the TIF_NOTIFY_SIGNAL remains >>>> >>>> static int io_req_task_work_add(struct io_kiocb *req) >>>> { >>>> ... >>>> notify = (req->ctx->flags & IORING_SETUP_SQPOLL) ? TWA_NONE : TWA_SIGNAL; >>>> if (!task_work_add(tsk, &tctx->task_work, notify)) >>>> ... >>>> } >>>> >>>> io_uring doesn't set TIF_NOTIFY_SIGNAL for SQPOLL. But if you see it, I'm >>>> rather curious who does. >>> I was saying io-uring, but I meant io-uring in the wider sense: >>> io_queue_worker_create(). >>> Here is a call trace for when TWA_SIGNAL is used. io_queue_worker_create() >>> uses TWA_SIGNAL. It is called by io_wqe_dec_running(), and not shown due >>> to inlining: >> Hi Nadav, Pavel, >> How about trying to make this kind of call to use TWA_NONE for sqthread, >> though I know for this case currently there is no info to get to know if >> task is sqthread. I think we shouldn't kick sqthread. > > It is possible, but it would break the abstractions and propagating > it would be disgusting. Let me give it some thought. We already do io_wq_enqueue() only from the right task context, so in theory instead of pushing it through tw, we can create a new thread on the spot. Though, would need to be careful with locking. Anyway, agree that it's better to be left for next. > Regardless, I think that this patch should go to 5.14 and stable, > and any solution to avoid kicking the SQ should come on top (to be > safe). -- Pavel Begunkov