io_uring: fix invalid ctx->sq_thread_idle
authorPavel Begunkov <asml.silence@gmail.com>
Wed, 10 Mar 2021 13:13:53 +0000 (13:13 +0000)
committerJens Axboe <axboe@kernel.dk>
Wed, 10 Mar 2021 14:29:59 +0000 (07:29 -0700)
We have to set ctx->sq_thread_idle before adding a ring to an SQ task,
otherwise sqd races for seeing zero and accounting it as such.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c

index 14165e18020c1692fdbf4c8873d433f9ca06876c..7072c0eb22c15bc03e1025efffa49d44a5125dc1 100644 (file)
@@ -7829,14 +7829,14 @@ static int io_sq_offload_create(struct io_ring_ctx *ctx,
 
                ctx->sq_creds = get_current_cred();
                ctx->sq_data = sqd;
-               io_sq_thread_park(sqd);
-               list_add(&ctx->sqd_list, &sqd->ctx_new_list);
-               io_sq_thread_unpark(sqd);
-
                ctx->sq_thread_idle = msecs_to_jiffies(p->sq_thread_idle);
                if (!ctx->sq_thread_idle)
                        ctx->sq_thread_idle = HZ;
 
+               io_sq_thread_park(sqd);
+               list_add(&ctx->sqd_list, &sqd->ctx_new_list);
+               io_sq_thread_unpark(sqd);
+
                if (sqd->thread)
                        return 0;