| From b2a3c63e90a060d4f65995385b5dffed034780f5 Mon Sep 17 00:00:00 2001 |
| From: Stefano Garzarella <sgarzare@redhat.com> |
| Date: Fri, 21 Feb 2020 16:42:16 +0100 |
| Subject: [PATCH] io_uring: prevent sq_thread from spinning when it should stop |
| |
| commit 7143b5ac5750f404ff3a594b34fdf3fc2f99f828 upstream. |
| |
| 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@redhat.com> |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| [PG: original moved cur_mm up; here polling block moves down instead.] |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/io_uring.c b/fs/io_uring.c |
| index 0761c28e8b2e..a6dd8cea8853 100644 |
| --- a/fs/io_uring.c |
| +++ b/fs/io_uring.c |
| @@ -2160,16 +2160,6 @@ static int io_sq_thread(void *data) |
| |
| if (!io_get_sqring(ctx, &sqes[0])) { |
| /* |
| - * We're polling. If we're within the defined idle |
| - * period, then let us spin without work before going |
| - * to sleep. |
| - */ |
| - if (inflight || !time_after(jiffies, timeout)) { |
| - cpu_relax(); |
| - 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 |
| @@ -2181,6 +2171,16 @@ static int io_sq_thread(void *data) |
| cur_mm = NULL; |
| } |
| |
| + /* |
| + * We're polling. If we're within the defined idle |
| + * period, then let us spin without work before going |
| + * to sleep. |
| + */ |
| + if (inflight || !time_after(jiffies, timeout)) { |
| + cpu_relax(); |
| + continue; |
| + } |
| + |
| prepare_to_wait(&ctx->sqo_wait, &wait, |
| TASK_INTERRUPTIBLE); |
| |
| -- |
| 2.7.4 |
| |