Re: FAILED: patch "[PATCH] io_uring: prevent sq_thread from spinning when it should stop" failed to apply to 5.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux