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