From: Christoph Hellwig <hch@infradead.org>
To: Jens Axboe <axboe@kernel.dk>
Cc: linux-block@vger.kernel.org
Subject: Re: [PATCH 04/11] block: avoid ordered task state change for polled IO
Date: Fri, 16 Nov 2018 00:41:34 -0800 [thread overview]
Message-ID: <20181116084134.GF9023@infradead.org> (raw)
In-Reply-To: <20181115195135.22812-5-axboe@kernel.dk>
On Thu, Nov 15, 2018 at 12:51:28PM -0700, Jens Axboe wrote:
> Ensure that writes to the dio/bio waiter field are ordered
> correctly. With the smp_rmb() before the READ_ONCE() check,
> we should be able to use a more relaxed ordering for the
> task state setting. We don't need a heavier barrier on
> the wakeup side after writing the waiter field, since we
> either going to be in the task we care about, or go through
> wake_up_process() which implies a strong enough barrier.
>
> 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.
>
> Signed-off-by: Jens Axboe <axboe@kernel.dk>
> ---
> block/blk-mq.c | 4 ++--
> fs/block_dev.c | 9 +++++++--
> fs/iomap.c | 4 +++-
> mm/page_io.c | 4 +++-
> 4 files changed, 15 insertions(+), 6 deletions(-)
>
> diff --git a/block/blk-mq.c b/block/blk-mq.c
> index 32b246ed44c0..7fc4abb4cc36 100644
> --- a/block/blk-mq.c
> +++ b/block/blk-mq.c
> @@ -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;
> diff --git a/fs/block_dev.c b/fs/block_dev.c
> index c039abfb2052..5b754f84c814 100644
> --- a/fs/block_dev.c
> +++ b/fs/block_dev.c
> @@ -237,9 +237,12 @@ __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);
> +
> + smp_rmb();
> if (!READ_ONCE(bio.bi_private))
> break;
> +
> if (!(iocb->ki_flags & IOCB_HIPRI) ||
> !blk_poll(bdev_get_queue(bdev), qc))
> io_schedule();
> @@ -403,7 +406,9 @@ __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);
> +
> + smp_rmb();
> if (!READ_ONCE(dio->waiter))
> break;
>
> diff --git a/fs/iomap.c b/fs/iomap.c
> index f61d13dfdf09..3373ea4984d9 100644
> --- a/fs/iomap.c
> +++ b/fs/iomap.c
> @@ -1888,7 +1888,9 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
> return -EIOCBQUEUED;
>
> for (;;) {
> - set_current_state(TASK_UNINTERRUPTIBLE);
> + __set_current_state(TASK_UNINTERRUPTIBLE);
> +
> + smp_rmb();
> if (!READ_ONCE(dio->submit.waiter))
> break;
>
> diff --git a/mm/page_io.c b/mm/page_io.c
> index d4d1c89bcddd..008f6d00c47c 100644
> --- a/mm/page_io.c
> +++ b/mm/page_io.c
> @@ -405,7 +405,9 @@ 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);
> +
> + smp_rmb();
> if (!READ_ONCE(bio->bi_private))
I think any smp_rmb() should have a big fact comment explaining it.
Also to help stupid people like me that dont understand why we even
need it here given the READ_ONCE below.
next prev parent reply other threads:[~2018-11-16 8:41 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-15 19:51 [PATCHSET v2 0/11] Various block optimizations Jens Axboe
2018-11-15 19:51 ` [PATCH 01/11] nvme: provide optimized poll function for separate poll queues Jens Axboe
2018-11-16 8:35 ` Christoph Hellwig
2018-11-16 15:22 ` Jens Axboe
2018-11-15 19:51 ` [PATCH 02/11] block: add queue_is_mq() helper Jens Axboe
2018-11-16 8:35 ` Christoph Hellwig
2018-11-15 19:51 ` [PATCH 03/11] blk-rq-qos: inline check for q->rq_qos functions Jens Axboe
2018-11-16 8:38 ` Christoph Hellwig
2018-11-16 15:18 ` Jens Axboe
2018-11-15 19:51 ` [PATCH 04/11] block: avoid ordered task state change for polled IO Jens Axboe
2018-11-16 8:41 ` Christoph Hellwig [this message]
2018-11-16 15:32 ` Jens Axboe
2018-11-15 19:51 ` [PATCH 05/11] block: add polled wakeup task helper Jens Axboe
2018-11-16 8:41 ` Christoph Hellwig
2018-11-15 19:51 ` [PATCH 06/11] block: have ->poll_fn() return number of entries polled Jens Axboe
2018-11-15 19:51 ` [PATCH 07/11] blk-mq: when polling for IO, look for any completion Jens Axboe
2018-11-16 8:43 ` Christoph Hellwig
2018-11-16 15:19 ` Jens Axboe
2018-11-16 16:57 ` Jens Axboe
2018-11-15 19:51 ` [PATCH 08/11] block: make blk_poll() take a parameter on whether to spin or not Jens Axboe
2018-11-15 19:51 ` [PATCH 09/11] blk-mq: ensure mq_ops ->poll() is entered at least once Jens Axboe
2018-11-15 19:51 ` [PATCH 10/11] block: for async O_DIRECT, mark us as polling if asked to Jens Axboe
2018-11-16 8:47 ` Christoph Hellwig
2018-11-16 8:48 ` Christoph Hellwig
2018-11-16 15:19 ` Jens Axboe
2018-11-15 19:51 ` [PATCH 11/11] block: don't plug for aio/O_DIRECT HIPRI IO Jens Axboe
2018-11-16 8:49 ` Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181116084134.GF9023@infradead.org \
--to=hch@infradead.org \
--cc=axboe@kernel.dk \
--cc=linux-block@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).