Skip to content

Commit

Permalink
io_uring: don't reinstall quiesce node for each tw
Browse files Browse the repository at this point in the history
There is no need to reinit data and install a new rsrc node every time
we get a task_work, it's detrimental, just execute it and conitnue
waiting.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/3895d3344164cd9b3a0bbb24a6e357e20a13434b.1669821213.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
  • Loading branch information
isilence authored and axboe committed Nov 30, 2022
1 parent 0ced756 commit 77e3202
Showing 1 changed file with 18 additions and 20 deletions.
38 changes: 18 additions & 20 deletions io_uring/rsrc.c
Original file line number Diff line number Diff line change
Expand Up @@ -309,22 +309,27 @@ __cold static int io_rsrc_ref_quiesce(struct io_rsrc_data *data,
/* As we may drop ->uring_lock, other task may have started quiesce */
if (data->quiesce)
return -ENXIO;
ret = io_rsrc_node_switch_start(ctx);
if (ret)
return ret;
io_rsrc_node_switch(ctx, data);

/* kill initial ref, already quiesced if zero */
if (atomic_dec_and_test(&data->refs))
return 0;

data->quiesce = true;
mutex_unlock(&ctx->uring_lock);
do {
ret = io_rsrc_node_switch_start(ctx);
if (ret)
break;
io_rsrc_node_switch(ctx, data);

/* kill initial ref, already quiesced if zero */
if (atomic_dec_and_test(&data->refs))
break;
mutex_unlock(&ctx->uring_lock);

ret = io_run_task_work_sig(ctx);
if (ret < 0)
goto reinit;
if (ret < 0) {
atomic_inc(&data->refs);
/* wait for all works potentially completing data->done */
flush_delayed_work(&ctx->rsrc_put_work);
reinit_completion(&data->done);
mutex_lock(&ctx->uring_lock);
break;
}

flush_delayed_work(&ctx->rsrc_put_work);
ret = wait_for_completion_interruptible(&data->done);
Expand All @@ -338,14 +343,7 @@ __cold static int io_rsrc_ref_quiesce(struct io_rsrc_data *data,
*/
mutex_unlock(&ctx->uring_lock);
}
reinit:
atomic_inc(&data->refs);
/* wait for all works potentially completing data->done */
flush_delayed_work(&ctx->rsrc_put_work);
reinit_completion(&data->done);

mutex_lock(&ctx->uring_lock);
} while (ret >= 0);
} while (1);
data->quiesce = false;

return ret;
Expand Down

0 comments on commit 77e3202

Please sign in to comment.