From: Ming Lei <ming.lei@redhat.com>
To: Bart Van Assche <bvanassche@acm.org>
Cc: "jianchao.wang" <jianchao.w.wang@oracle.com>,
Jens Axboe <axboe@kernel.dk>,
linux-block@vger.kernel.org,
James Smart <james.smart@broadcom.com>,
Bart Van Assche <bart.vanassche@wdc.com>,
linux-scsi@vger.kernel.org,
"Martin K . Petersen" <martin.petersen@oracle.com>,
Christoph Hellwig <hch@lst.de>,
"James E . J . Bottomley" <jejb@linux.vnet.ibm.com>
Subject: Re: [PATCH 0/5] blk-mq: allow to run queue if queue refcount is held
Date: Wed, 3 Apr 2019 11:20:54 +0800 [thread overview]
Message-ID: <20190403032053.GA9968@ming.t460p> (raw)
In-Reply-To: <1554227580.118779.158.camel@acm.org>
On Tue, Apr 02, 2019 at 10:53:00AM -0700, Bart Van Assche wrote:
> On Tue, 2019-04-02 at 19:05 +0800, Ming Lei wrote:
> > On Tue, Apr 02, 2019 at 04:07:04PM +0800, jianchao.wang wrote:
> > > percpu_ref is born for fast path.
> > > There are some drivers use it in completion path, such as scsi, does it really
> > > matter for this kind of device ? If yes, I guess we should remove blk_mq_run_hw_queues
> > > which is the really bulk and depend on hctx restart mechanism.
> >
> > Yes, it is designed for fast path, but it doesn't mean percpu_ref
> > hasn't any cost. blk_mq_run_hw_queues() is called for all blk-mq devices,
> > includes the fast NVMe.
>
> I think the overhead of adding a percpu_ref_get/put pair is acceptable for
> SCSI drivers. The NVMe driver doesn't call blk_mq_run_hw_queues() directly.
> Additionally, I don't think that any of the blk_mq_run_hw_queues() calls from
> the block layer matter for the fast path code in the NVMe driver. In other
> words, adding a percpu_ref_get/put pair in blk_mq_run_hw_queues() shouldn't
> affect the performance of the NVMe driver.
But it can be avoided easily and cleanly, why abuse it for protecting hctx?
>
> > Also:
> >
> > It may not be enough to just grab the percpu_ref for blk_mq_run_hw_queues
> > only, given the idea is to use the percpu_ref to protect hctx's resources.
> >
> > There are lots of uses on 'hctx', such as other exported blk-mq APIs.
> > If this approach were chosen, we may have to audit other blk-mq APIs,
> > cause they might be called after queue is frozen too.
>
> The only blk_mq_hw_ctx user I have found so far that needs additional
> protection is the q->mq_ops->poll() call in blk_poll(). However, that is not
> a new issue. Functions like nvme_poll() access data structures (NVMe
> completion queue) that shouldn't be accessed while blk_cleanup_queue() is in
> progress. If blk_poll() is modified such that it becomes safe to call that
> function while blk_cleanup_queue() is in progress then blk_poll() won't
> access any hardware queue that it shouldn't access.
There can be lots of such case:
1) blk_mq_run_hw_queue() from blk_mq_flush_plug_list()
- requests can be completed just after added to ctx queue or scheduler queue
becasue there can be concurrent run queue, then queue freezing may be done
- then the following blk_mq_run_hw_queue() in blk_mq_sched_insert_requests()
may see freed hctx fields
2) blk_mq_delay_run_hw_queue
- what if it is called after blk_sync_queue() is done in
blk_cleanup_queue()
- but the caller follows the old rule by holding request queue's
refcount
3) blk_mq_quiesce_queue
- called after blk_mq_free_queue() is done, then use-after-free on hctx->srcu
- but the caller follows the old rule by holding request queue's
...
Thanks,
Ming
next prev parent reply other threads:[~2019-04-03 3:21 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-31 3:09 [PATCH 0/5] blk-mq: allow to run queue if queue refcount is held Ming Lei
2019-03-31 3:09 ` [PATCH 1/5] blk-mq: re-organize blk_mq_exit_hctx() into two parts Ming Lei
2019-04-01 1:40 ` Dongli Zhang
2019-04-01 2:06 ` Ming Lei
2019-03-31 3:09 ` [PATCH 2/5] blk-mq: re-organize blk_mq_exit_hw_queues() " Ming Lei
2019-03-31 3:09 ` [PATCH 3/5] blk-mq: free hw queues in queue's release handler Ming Lei
2019-03-31 3:09 ` [PATCH 4/5] block: don't drain in-progress dispatch in blk_cleanup_queue() Ming Lei
2019-04-01 1:50 ` Dongli Zhang
2019-04-01 2:08 ` Ming Lei
2019-03-31 3:09 ` [PATCH 5/5] SCSI: don't grab queue usage counter before run queue Ming Lei
2019-04-01 1:53 ` Dongli Zhang
2019-03-31 15:27 ` [PATCH 0/5] blk-mq: allow to run queue if queue refcount is held Bart Van Assche
2019-04-01 2:00 ` Ming Lei
2019-04-01 2:39 ` Bart Van Assche
2019-04-01 2:44 ` jianchao.wang
2019-04-02 18:07 ` Bart Van Assche
2019-04-01 2:52 ` Ming Lei
2019-04-01 3:25 ` jianchao.wang
2019-04-01 3:28 ` Ming Lei
2019-04-01 9:19 ` jianchao.wang
2019-04-01 10:03 ` Ming Lei
2019-04-02 2:02 ` jianchao.wang
2019-04-02 2:55 ` Ming Lei
2019-04-02 8:07 ` jianchao.wang
2019-04-02 11:05 ` Ming Lei
2019-04-02 17:53 ` Bart Van Assche
2019-04-03 3:20 ` Ming Lei [this message]
2019-04-03 8:29 ` Ming Lei
2019-04-03 8:43 ` Ming Lei
2019-04-02 18:11 ` Bart Van Assche
2019-04-03 3:24 ` Ming Lei
2019-04-01 5:05 ` Dongli Zhang
2019-04-01 5:16 ` Ming Lei
2019-04-01 5:30 ` Dongli Zhang
2019-04-01 7:15 ` Ming Lei
2019-04-02 2:10 ` Dongli Zhang
2019-04-02 2:20 ` Ming Lei
2019-04-01 3:27 ` Ming Lei
2019-04-01 3:32 ` jianchao.wang
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=20190403032053.GA9968@ming.t460p \
--to=ming.lei@redhat.com \
--cc=axboe@kernel.dk \
--cc=bart.vanassche@wdc.com \
--cc=bvanassche@acm.org \
--cc=hch@lst.de \
--cc=james.smart@broadcom.com \
--cc=jejb@linux.vnet.ibm.com \
--cc=jianchao.w.wang@oracle.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
/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.