On 31/01/2021 14:39, Hao Xu wrote: [...] > So check if sqthread gets park flag right before schedule(). > since ctx_list is always empty when this problem happens, here I put > kthread_should_park() before setting the wakeup flag(ctx_list is empty > so this for loop is fast), where is close enough to schedule(). The > problem doesn't show again in my repro testing after this fix. > Reviewed-by: Pavel Begunkov <asml.silence@xxxxxxxxx> > Reported-by: Abaci <abaci@xxxxxxxxxxxxxxxxx> > Signed-off-by: Hao Xu <haoxu@xxxxxxxxxxxxxxxxx> > --- > > v1-->v2 > - tweak the commit message > > v2-->v3 > - remove duplicate kthread_should_park() since thread parking is rare > operation > - put kthread_should_park() in if (needs_sched) > > > fs/io_uring.c | 5 +---- > 1 file changed, 1 insertion(+), 4 deletions(-) > > diff --git a/fs/io_uring.c b/fs/io_uring.c > index c07913ec0cca..d9019ce2bda0 100644 > --- a/fs/io_uring.c > +++ b/fs/io_uring.c > @@ -7115,9 +7115,6 @@ static int io_sq_thread(void *data) > continue; > } > > - if (kthread_should_park()) > - continue; > - > needs_sched = true; > prepare_to_wait(&sqd->wait, &wait, TASK_INTERRUPTIBLE); > list_for_each_entry(ctx, &sqd->ctx_list, sqd_list) { > @@ -7132,7 +7129,7 @@ static int io_sq_thread(void *data) > } > } > > - if (needs_sched) { > + if (needs_sched && !kthread_should_park()) { > list_for_each_entry(ctx, &sqd->ctx_list, sqd_list) > io_ring_set_wakeup_flag(ctx); > > -- Pavel Begunkov