On Thu, Feb 27, 2020 at 11:12 AM <gregkh@xxxxxxxxxxxxxxxxxxx> wrote: > The patch below does not apply to the 5.4-stable tree. > If someone wants it applied there, or to any other stable or longterm > tree, then please email the backport, including the original git commit > id to <stable@xxxxxxxxxxxxxxx>. Thanks, I'll send the backport for 5.4-stable tree. Stefano > > thanks, > > greg k-h > > ------------------ original commit in Linus's tree ------------------ > > From 7143b5ac5750f404ff3a594b34fdf3fc2f99f828 Mon Sep 17 00:00:00 2001 > From: Stefano Garzarella <sgarzare@xxxxxxxxxx> > Date: Fri, 21 Feb 2020 16:42:16 +0100 > Subject: [PATCH] io_uring: prevent sq_thread from spinning when it should stop > > This patch drops 'cur_mm' before calling cond_resched(), to prevent > the sq_thread from spinning even when the user process is finished. > > Before this patch, if the user process ended without closing the > io_uring fd, the sq_thread continues to spin until the > 'sq_thread_idle' timeout ends. > > In the worst case where the 'sq_thread_idle' parameter is bigger than > INT_MAX, the sq_thread will spin forever. > > Fixes: 6c271ce2f1d5 ("io_uring: add submission polling") > Signed-off-by: Stefano Garzarella <sgarzare@xxxxxxxxxx> > Signed-off-by: Jens Axboe <axboe@xxxxxxxxx> > > diff --git a/fs/io_uring.c b/fs/io_uring.c > index 6e249aa97ba3..b43467b3a8dc 100644 > --- a/fs/io_uring.c > +++ b/fs/io_uring.c > @@ -5142,6 +5142,18 @@ static int io_sq_thread(void *data) > * to enter the kernel to reap and flush events. > */ > if (!to_submit || ret == -EBUSY) { > + /* > + * Drop cur_mm before scheduling, we can't hold it for > + * long periods (or over schedule()). Do this before > + * adding ourselves to the waitqueue, as the unuse/drop > + * may sleep. > + */ > + if (cur_mm) { > + unuse_mm(cur_mm); > + mmput(cur_mm); > + cur_mm = NULL; > + } > + > /* > * We're polling. If we're within the defined idle > * period, then let us spin without work before going > @@ -5156,18 +5168,6 @@ static int io_sq_thread(void *data) > continue; > } > > - /* > - * Drop cur_mm before scheduling, we can't hold it for > - * long periods (or over schedule()). Do this before > - * adding ourselves to the waitqueue, as the unuse/drop > - * may sleep. > - */ > - if (cur_mm) { > - unuse_mm(cur_mm); > - mmput(cur_mm); > - cur_mm = NULL; > - } > - > prepare_to_wait(&ctx->sqo_wait, &wait, > TASK_INTERRUPTIBLE); > > -- Stefano Garzarella Software Engineer, Virt Team Red Hat