Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 849a3700 authored by Jens Axboe's avatar Jens Axboe
Browse files

block: avoid ordered task state change for polled IO



For the core poll helper, the task state setting don't need to imply any
atomics, as it's the current task itself that is being modified and
we're not going to sleep.

For IRQ driven, the wakeup path have the necessary barriers to not need
us using the heavy handed version of the task state setting.

Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent a4668d9b
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -3331,12 +3331,12 @@ static bool __blk_mq_poll(struct blk_mq_hw_ctx *hctx, struct request *rq)
		ret = q->mq_ops->poll(hctx, rq->tag);
		if (ret > 0) {
			hctx->poll_success++;
			set_current_state(TASK_RUNNING);
			__set_current_state(TASK_RUNNING);
			return true;
		}

		if (signal_pending_state(state, current))
			set_current_state(TASK_RUNNING);
			__set_current_state(TASK_RUNNING);

		if (current->state == TASK_RUNNING)
			return true;
+5 −2
Original line number Diff line number Diff line
@@ -237,9 +237,11 @@ __blkdev_direct_IO_simple(struct kiocb *iocb, struct iov_iter *iter,

	qc = submit_bio(&bio);
	for (;;) {
		set_current_state(TASK_UNINTERRUPTIBLE);
		__set_current_state(TASK_UNINTERRUPTIBLE);

		if (!READ_ONCE(bio.bi_private))
			break;

		if (!(iocb->ki_flags & IOCB_HIPRI) ||
		    !blk_poll(bdev_get_queue(bdev), qc))
			io_schedule();
@@ -415,7 +417,8 @@ __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, int nr_pages)
		return -EIOCBQUEUED;

	for (;;) {
		set_current_state(TASK_UNINTERRUPTIBLE);
		__set_current_state(TASK_UNINTERRUPTIBLE);

		if (!READ_ONCE(dio->waiter))
			break;

+2 −1
Original line number Diff line number Diff line
@@ -1888,7 +1888,8 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
			return -EIOCBQUEUED;

		for (;;) {
			set_current_state(TASK_UNINTERRUPTIBLE);
			__set_current_state(TASK_UNINTERRUPTIBLE);

			if (!READ_ONCE(dio->submit.waiter))
				break;

+2 −1
Original line number Diff line number Diff line
@@ -405,7 +405,8 @@ int swap_readpage(struct page *page, bool synchronous)
	bio_get(bio);
	qc = submit_bio(bio);
	while (synchronous) {
		set_current_state(TASK_UNINTERRUPTIBLE);
		__set_current_state(TASK_UNINTERRUPTIBLE);

		if (!READ_ONCE(bio->bi_private))
			break;