On 7/5/19 12:12 AM, Jackie Liu wrote: > diff --git a/fs/io_uring.c b/fs/io_uring.c > index 4ef62a4..4bbecbb 100644 > --- a/fs/io_uring.c > +++ b/fs/io_uring.c > @@ -231,6 +231,7 @@ struct io_ring_ctx { > struct task_struct *sqo_thread; /* if using sq thread polling */ > struct mm_struct *sqo_mm; > wait_queue_head_t sqo_wait; > + bool sqo_thread_started; > > struct { > /* CQ ring */ > @@ -2009,6 +2010,8 @@ static int io_sq_thread(void *data) > unsigned inflight; > unsigned long timeout; > > + ctx->sqo_thread_started = true; > + > old_fs = get_fs(); > set_fs(USER_DS); > > @@ -2243,6 +2246,8 @@ static int io_sqe_files_unregister(struct io_ring_ctx *ctx) > static void io_sq_thread_stop(struct io_ring_ctx *ctx) > { > if (ctx->sqo_thread) { > + while (!ctx->sqo_thread_started) > + schedule(); > /* > * The park is a bit of a work-around, without it we get > * warning spews on shutdown with SQPOLL set and affinity > Probably want to make that an unsigned long, and then use set_bit/test_bit for this to avoid funky memory ordering issues. -- Jens Axboe