Commit 77e3202a authored by Pavel Begunkov's avatar Pavel Begunkov Committed by Jens Axboe
Browse files

io_uring: don't reinstall quiesce node for each tw



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: default avatarPavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/3895d3344164cd9b3a0bbb24a6e357e20a13434b.1669821213.git.asml.silence@gmail.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 0ced756f
Loading
Loading
Loading
Loading
+18 −20
Original line number Diff line number Diff line
@@ -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;

	data->quiesce = true;
	do {
	ret = io_rsrc_node_switch_start(ctx);
	if (ret)
			break;
		return ret;
	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);
		return 0;

	data->quiesce = true;
	mutex_unlock(&ctx->uring_lock);
	do {
		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);
@@ -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;