From: Bart Van Assche <bvanassche@acm.org>
To: Ming Lei <ming.lei@redhat.com>
Cc: Jens Axboe <axboe@kernel.dk>,
linux-block@vger.kernel.org, Christoph Hellwig <hch@lst.de>,
Jianchao Wang <jianchao.w.wang@oracle.com>,
Hannes Reinecke <hare@suse.com>,
Johannes Thumshirn <jthumshirn@suse.de>,
Alan Stern <stern@rowland.harvard.edu>
Subject: Re: [PATCH v9 7/8] block: Make blk_get_request() block for non-PM requests while suspended
Date: Thu, 20 Sep 2018 08:23:10 -0700 [thread overview]
Message-ID: <1537456990.204730.5.camel@acm.org> (raw)
In-Reply-To: <20180920034851.GD27645@ming.t460p>
On Thu, 2018-09-20 at 11:48 +0800, Ming Lei wrote:
> On Wed, Sep 19, 2018 at 03:45:29PM -0700, Bart Van Assche wrote:
> > + ret = -EBUSY;
> > + if (blk_requests_in_flight(q) == 0) {
> > + blk_freeze_queue_start(q);
> > + /*
> > + * Freezing a queue starts a transition of the
> > queue
> > + * usage counter to atomic mode. Wait until atomic
> > + * mode has been reached. This involves calling
> > + * call_rcu(). That call guarantees that later
> > + * blk_queue_enter() calls see the pm-only state.
> > See
> > + * also http://lwn.net/Articles/573497/.
> > + */
> > + percpu_ref_switch_to_atomic_sync(&q-
> > >q_usage_counter);
> > + if (percpu_ref_is_zero(&q->q_usage_counter))
> > + ret = 0;
> > + blk_mq_unfreeze_queue(q);
>
> Tejun doesn't agree on this kind of usage yet, so the ref has to be
> dropped before calling blk_mq_unfreeze_queue().
I read all Tejuns' recent e-mails but I have not found any e-mail from
Tejun in which he wrote that he disagrees with the above pattern.
> Also, this way still can't address the race in the following link:
>
> https://marc.info/?l=linux-block&m=153732992701093&w=2
I think that the following patch is sufficient to fix that race:
diff --git a/block/blk-core.c b/block/blk-core.c
index ae092ca121d5..16dd3a989753 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -942,8 +942,6 @@ int blk_queue_enter(struct request_queue *q,
blk_mq_req_flags_t flags)
if (success)
return 0;
- blk_pm_request_resume(q);
-
if (flags & BLK_MQ_REQ_NOWAIT)
return -EBUSY;
@@ -958,7 +956,8 @@ int blk_queue_enter(struct request_queue *q,
blk_mq_req_flags_t flags)
wait_event(q->mq_freeze_wq,
(atomic_read(&q->mq_freeze_depth) == 0 &&
- (pm || !blk_queue_pm_only(q))) ||
+ (pm || (blk_pm_request_resume(q),
+ !blk_queue_pm_only(q)))) ||
blk_queue_dying(q));
if (blk_queue_dying(q))
return -ENODEV;
Bart.
next prev parent reply other threads:[~2018-09-20 15:23 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-19 22:45 [PATCH v9 0/8] blk-mq: Implement runtime power management Bart Van Assche
2018-09-19 22:45 ` [PATCH v9 1/8] blk-mq: Document the functions that iterate over requests Bart Van Assche
2018-09-20 7:35 ` Johannes Thumshirn
2018-09-20 15:30 ` Bart Van Assche
2018-09-19 22:45 ` [PATCH v9 2/8] blk-mq: Introduce blk_mq_queue_rq_iter() Bart Van Assche
2018-09-19 22:45 ` [PATCH v9 3/8] block: Move power management code into a new source file Bart Van Assche
2018-09-19 22:45 ` [PATCH v9 4/8] block, scsi: Change the preempt-only flag into a counter Bart Van Assche
2018-09-19 22:45 ` [PATCH v9 5/8] block: Split blk_pm_add_request() and blk_pm_put_request() Bart Van Assche
2018-09-19 22:45 ` [PATCH v9 6/8] block: Schedule runtime resume earlier Bart Van Assche
2018-09-19 22:45 ` [PATCH v9 7/8] block: Make blk_get_request() block for non-PM requests while suspended Bart Van Assche
2018-09-20 3:48 ` Ming Lei
2018-09-20 15:23 ` Bart Van Assche [this message]
2018-09-21 0:54 ` Ming Lei
2018-09-19 22:45 ` [PATCH v9 8/8] blk-mq: Enable support for runtime power management Bart Van Assche
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=1537456990.204730.5.camel@acm.org \
--to=bvanassche@acm.org \
--cc=axboe@kernel.dk \
--cc=hare@suse.com \
--cc=hch@lst.de \
--cc=jianchao.w.wang@oracle.com \
--cc=jthumshirn@suse.de \
--cc=linux-block@vger.kernel.org \
--cc=ming.lei@redhat.com \
--cc=stern@rowland.harvard.edu \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.