spin_unlock_irq(&ctx->completion_lock);
 }
 
+static int io_sq_wake_function(struct wait_queue_entry *wqe, unsigned mode,
+                              int sync, void *key)
+{
+       struct io_ring_ctx *ctx = container_of(wqe, struct io_ring_ctx, sqo_wait_entry);
+       int ret;
+
+       ret = autoremove_wake_function(wqe, mode, sync, key);
+       if (ret) {
+               unsigned long flags;
+
+               spin_lock_irqsave(&ctx->completion_lock, flags);
+               ctx->rings->sq_flags &= ~IORING_SQ_NEED_WAKEUP;
+               spin_unlock_irqrestore(&ctx->completion_lock, flags);
+       }
+       return ret;
+}
+
 static int io_sq_thread(void *data)
 {
        struct io_ring_ctx *ctx = data;
        int ret = 0;
 
        init_wait(&ctx->sqo_wait_entry);
+       ctx->sqo_wait_entry.func = io_sq_wake_function;
 
        complete(&ctx->sq_thread_comp);
 
                                schedule();
                                finish_wait(ctx->sqo_wait, &ctx->sqo_wait_entry);
 
-                               io_ring_clear_wakeup_flag(ctx);
                                ret = 0;
                                continue;
                        }