From: Ming Lei <ming.lei@redhat.com>
To: Nilay Shroff <nilay@linux.ibm.com>
Cc: Christoph Hellwig <hch@lst.de>,
Damien Le Moal <dlemoal@kernel.org>, Jens Axboe <axboe@kernel.dk>,
linux-block@vger.kernel.org
Subject: Re: [PATCH 1/2] block: avoid to hold q->limits_lock across APIs for atomic update queue limits
Date: Mon, 30 Dec 2024 17:02:35 +0800 [thread overview]
Message-ID: <Z3Jhq5Z4gLupIrYm@fedora> (raw)
In-Reply-To: <cf1e007b-dcb5-43cd-84e2-fd72d8836fb8@linux.ibm.com>
On Sat, Dec 21, 2024 at 06:33:13PM +0530, Nilay Shroff wrote:
>
>
> On 12/19/24 11:50, Christoph Hellwig wrote:
> > On Wed, Dec 18, 2024 at 06:57:45AM -0800, Damien Le Moal wrote:
> >>> Yeah agreed but I see sd_revalidate_disk() is probably the only exception
> >>> which allocates the blk-mq request. Can't we fix it?
> >>
> >> If we change where limits_lock is taken now, we will again introduce races
> >> between user config and discovery/revalidation, which is what
> >> queue_limits_start_update() and queue_limits_commit_update() intended to fix in
> >> the first place.
> >>
> >> So changing sd_revalidate_disk() is not the right approach.
> >
> > Well, sd_revalidate_disk is a bit special in that it needs a command
> > on the same queue to query the information. So it needs to be able
> > to issue commands without the queue frozen. Freezing the queue inside
> > the limits lock support that, sd just can't use the convenience helpers
> > that lock and freeze.
> >
> >> This is overly complicated ... As I suggested, I think that a simpler approach
> >> is to call blk_mq_freeze_queue() and blk_mq_unfreeze_queue() inside
> >> queue_limits_commit_update(). Doing so, no driver should need to directly call
> >> freeze/unfreeze. But that would be a cleanup. Let's first fix the few instances
> >> that have the update/freeze order wrong. As mentioned, the pattern simply needs
> >
> > Yes, the queue only needs to be frozen for the actual update,
> > which would remove the need for the locking. The big question for both
> > variants is if we can get rid of all the callers that have the queue
> > already frozen and then start an update.
> >
> After thinking for a while I found that broadly we've four categories of users
> which need this pattern of limits-lock and/or queue-freeze:
>
> 1. Callers which need acquiring limits-lock while starting the update; and freezing
> queue only when committing the update:
> - sd_revalidate_disk
sd_revalidate_disk() should be the most strange one, in which
passthrough io command is required, so dependency on queue freeze lock
can't be added, such as, q->limits_lock
Actually the current queue limits structure aren't well-organized, otherwise
limit lock isn't needed for reading queue limits from hardware, since
sd_revalidate_disk() just overwrites partial limits. Or it can be
done by refactoring sd_revalidate_disk(). However, the change might
be a little big, and I guess that is the reason why Damien don't like
it.
> - nvme_init_identify
> - loop_clear_limits
> - few more...
>
> 2. Callers which need both freezing the queue and acquiring limits-lock while starting
> the update:
> - nvme_update_ns_info_block
> - nvme_update_ns_info_generic
> - few more...
>
> 3. Callers which neither need acquiring limits-lock nor require freezing queue as for
> these set of callers in the call stack limits-lock is already acquired and queue is
> already frozen:
> - __blk_mq_update_nr_hw_queues
> - queue_xxx_store and helpers
I think it isn't correct.
The queue limits are applied on fast IO path, in theory anywhere
updating q->limits need to drain IOs in submission path at least
after gendisk is added.
Also Christoph adds limits-lock for avoiding to lose other concurrent
update, which makes the problem more hard to solve.
Thanks,
Ming
next prev parent reply other threads:[~2024-12-30 9:02 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-16 8:02 [PATCH 0/2] block: fix deadlock caused by atomic limits update Ming Lei
2024-12-16 8:02 ` [PATCH 1/2] block: avoid to hold q->limits_lock across APIs for atomic update queue limits Ming Lei
2024-12-16 15:49 ` Christoph Hellwig
2024-12-17 1:52 ` Ming Lei
2024-12-17 4:40 ` Christoph Hellwig
2024-12-17 7:05 ` Ming Lei
2024-12-17 7:19 ` Christoph Hellwig
2024-12-17 7:30 ` Ming Lei
2024-12-17 16:07 ` Damien Le Moal
2024-12-18 2:09 ` Ming Lei
2024-12-18 11:33 ` Nilay Shroff
2024-12-18 13:40 ` Ming Lei
2024-12-18 14:05 ` Nilay Shroff
2024-12-18 14:57 ` Damien Le Moal
2024-12-19 6:20 ` Christoph Hellwig
2024-12-19 7:16 ` Nilay Shroff
2024-12-21 13:03 ` Nilay Shroff
2024-12-30 9:02 ` Ming Lei [this message]
2024-12-30 23:29 ` Damien Le Moal
2025-01-01 11:17 ` Nilay Shroff
2024-12-19 6:17 ` Christoph Hellwig
2024-12-19 6:15 ` Christoph Hellwig
2024-12-16 8:02 ` [PATCH 2/2] block: remove queue_limits_cancel_update() Ming Lei
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=Z3Jhq5Z4gLupIrYm@fedora \
--to=ming.lei@redhat.com \
--cc=axboe@kernel.dk \
--cc=dlemoal@kernel.org \
--cc=hch@lst.de \
--cc=linux-block@vger.kernel.org \
--cc=nilay@linux.ibm.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.