From: Bart Van Assche <bvanassche@acm.org>
To: John Garry <john.garry@huawei.com>,
hare@suse.de, ming.lei@redhat.com, axboe@kernel.dk, hch@lst.de
Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org,
pragalla@codeaurora.org, kashyap.desai@broadcom.com,
yuyufen@huawei.com
Subject: Re: [RFC PATCH v3 3/3] blk-mq: Lockout tagset iterator when exiting elevator
Date: Mon, 8 Mar 2021 11:59:23 -0800 [thread overview]
Message-ID: <784a3686-cb54-561d-740c-30e0b3f46df8@acm.org> (raw)
In-Reply-To: <9c9360bf-7ca9-5c8f-c61d-441044f9c78f@huawei.com>
On 3/8/21 3:17 AM, John Garry wrote:
> On 06/03/2021 04:43, Bart Van Assche wrote:
>> On 3/5/21 7:14 AM, John Garry wrote:
>>> diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c
>>> index 7ff1b20d58e7..5950fee490e8 100644
>>> --- a/block/blk-mq-tag.c
>>> +++ b/block/blk-mq-tag.c
>>> @@ -358,11 +358,16 @@ void blk_mq_tagset_busy_iter(struct
>>> blk_mq_tag_set *tagset,
>>> {
>>> int i;
>>> + if (!atomic_inc_not_zero(&tagset->iter_usage_counter))
>>> + return;
>>> +
>>> for (i = 0; i < tagset->nr_hw_queues; i++) {
>>> if (tagset->tags && tagset->tags[i])
>>> __blk_mq_all_tag_iter(tagset->tags[i], fn, priv,
>>> BT_TAG_ITER_STARTED);
>>> }
>>> +
>>> + atomic_dec(&tagset->iter_usage_counter);
>>> }
>>> EXPORT_SYMBOL(blk_mq_tagset_busy_iter);
>
> Hi Bart,
>
>> This changes the behavior of blk_mq_tagset_busy_iter(). What will e.g.
>> happen if the mtip driver calls blk_mq_tagset_busy_iter(&dd->tags,
>> mtip_abort_cmd, dd) concurrently with another blk_mq_tagset_busy_iter()
>> call and if that causes all mtip_abort_cmd() calls to be skipped?
>
> I'm not sure that I understand this problem you describe. So if
> blk_mq_tagset_busy_iter(&dd->tags, mtip_abort_cmd, dd) is called, either
> can happen:
> a. normal operation, iter_usage_counter initially holds >= 1, and then
> iter_usage_counter is incremented in blk_mq_tagset_busy_iter() and we
> iter the busy tags. Any parallel call to blk_mq_tagset_busy_iter() will
> also increase iter_usage_counter.
> b. we're switching IO scheduler. In this scenario, first we quiesce all
> queues. After that, there should be no active requests. At that point,
> we ensure any calls to blk_mq_tagset_busy_iter() are finished and block
> (or discard may be a better term) any more calls. Blocking any more
> calls should be safe as there are no requests to iter. atomic_cmpxchg()
> is used to set iter_usage_counter to 0, blocking any more calls.
Hi John,
My concern is about the insertion of the early return statement in
blk_mq_tagset_busy_iter(). Although most blk_mq_tagset_busy_iter()
callers can handle skipping certain blk_mq_tagset_busy_iter() calls
(e.g. when gathering statistics), I'm not sure this is safe for all
blk_mq_tagset_busy_iter() callers. The example I cited is an example of
a blk_mq_tagset_busy_iter() call with side effects.
The mtip driver allocates one tag set per request queue so quiescing
queues should be sufficient to address my concern for the mtip driver.
The NVMe core and SCSI core however share a single tag set across
multiple namespaces / LUNs. In the error path of nvme_rdma_setup_ctrl()
I found a call to nvme_cancel_tagset(). nvme_cancel_tagset() calls
blk_mq_tagset_busy_iter(ctrl->tagset, nvme_cancel_request, ctrl). I'm
not sure it is safe to skip the nvme_cancel_request() calls if the I/O
scheduler for another NVMe namespace is being modified.
Thanks,
Bart.
next prev parent reply other threads:[~2021-03-08 20:00 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-05 15:14 [RFC PATCH v3 0/3] blk-mq: Avoid use-after-free for accessing old requests John Garry
2021-03-05 15:14 ` [RFC PATCH v3 1/3] blk-mq: Clean up references to old requests when freeing rqs John Garry
2021-03-06 2:52 ` Khazhy Kumykov
2021-03-08 11:18 ` John Garry
2021-03-06 18:13 ` Bart Van Assche
2021-03-08 10:37 ` John Garry
2021-03-05 15:14 ` [RFC PATCH v3 2/3] blk-mq: Freeze and quiesce all queues for tagset in elevator_exit() John Garry
2021-03-06 4:32 ` Bart Van Assche
2021-03-08 10:50 ` John Garry
2021-03-08 19:35 ` Bart Van Assche
2021-03-10 15:57 ` Bart Van Assche
2021-03-11 0:58 ` Ming Lei
2021-03-11 8:21 ` John Garry
2021-03-12 23:05 ` Bart Van Assche
2021-03-16 16:15 ` John Garry
2021-03-16 17:00 ` Bart Van Assche
2021-03-16 17:43 ` John Garry
2021-03-16 19:59 ` Bart Van Assche
2021-03-19 18:19 ` John Garry
2021-03-19 18:32 ` Bart Van Assche
2021-03-05 15:14 ` [RFC PATCH v3 3/3] blk-mq: Lockout tagset iterator when exiting elevator John Garry
2021-03-06 4:43 ` Bart Van Assche
2021-03-08 11:17 ` John Garry
2021-03-08 19:59 ` Bart Van Assche [this message]
2021-03-09 17:47 ` John Garry
2021-03-09 19:21 ` Bart Van Assche
2021-03-10 8:52 ` John Garry
2021-03-10 16:00 ` Bart Van Assche
2021-03-10 17:26 ` John Garry
2021-03-18 10:26 ` [RFC PATCH v3 0/3] blk-mq: Avoid use-after-free for accessing old requests Shinichiro Kawasaki
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=784a3686-cb54-561d-740c-30e0b3f46df8@acm.org \
--to=bvanassche@acm.org \
--cc=axboe@kernel.dk \
--cc=hare@suse.de \
--cc=hch@lst.de \
--cc=john.garry@huawei.com \
--cc=kashyap.desai@broadcom.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=ming.lei@redhat.com \
--cc=pragalla@codeaurora.org \
--cc=yuyufen@huawei.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®