* [PATCH 0/2] block: fix two regressions in v6.13 dev cycle
@ 2024-12-18 10:16 Ming Lei
2024-12-18 10:16 ` [PATCH 1/2] block: Revert "block: Fix potential deadlock while freezing queue and acquiring sysfs_lock" Ming Lei
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Ming Lei @ 2024-12-18 10:16 UTC (permalink / raw)
To: Jens Axboe, linux-block; +Cc: Ming Lei
Hello Jens,
Fixes two regressions introduced recently.
Thanks,
Ming Lei (2):
block: Revert "block: Fix potential deadlock while freezing queue and
acquiring sysfs_lock"
block: avoid to reuse `hctx` not removed from cpuhp callback list
block/blk-mq-sysfs.c | 16 ++++++++++------
block/blk-mq.c | 40 +++++++++++++++++++++-------------------
block/blk-sysfs.c | 4 ++--
3 files changed, 33 insertions(+), 27 deletions(-)
--
2.47.0
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH 1/2] block: Revert "block: Fix potential deadlock while freezing queue and acquiring sysfs_lock" 2024-12-18 10:16 [PATCH 0/2] block: fix two regressions in v6.13 dev cycle Ming Lei @ 2024-12-18 10:16 ` Ming Lei 2024-12-20 10:23 ` Nilay Shroff 2024-12-18 10:16 ` [PATCH 2/2] block: avoid to reuse `hctx` not removed from cpuhp callback list Ming Lei 2024-12-18 14:25 ` [PATCH 0/2] block: fix two regressions in v6.13 dev cycle Jens Axboe 2 siblings, 1 reply; 9+ messages in thread From: Ming Lei @ 2024-12-18 10:16 UTC (permalink / raw) To: Jens Axboe, linux-block; +Cc: Ming Lei, Nilay Shroff This reverts commit be26ba96421ab0a8fa2055ccf7db7832a13c44d2. Commit be26ba96421a ("block: Fix potential deadlock while freezing queue and acquiring sysfs_loc") actually reverts commit 22465bbac53c ("blk-mq: move cpuhp callback registering out of q->sysfs_lock"), and causes the original resctrl lockdep warning. So revert it and we need to fix the issue in another way. Cc: Nilay Shroff <nilay@linux.ibm.com> Fixes: be26ba96421a ("block: Fix potential deadlock while freezing queue and acquiring sysfs_loc") Signed-off-by: Ming Lei <ming.lei@redhat.com> --- block/blk-mq-sysfs.c | 16 ++++++++++------ block/blk-mq.c | 29 +++++++++++------------------ block/blk-sysfs.c | 4 ++-- 3 files changed, 23 insertions(+), 26 deletions(-) diff --git a/block/blk-mq-sysfs.c b/block/blk-mq-sysfs.c index cd5ea6eaa76b..156e9bb07abf 100644 --- a/block/blk-mq-sysfs.c +++ b/block/blk-mq-sysfs.c @@ -275,13 +275,15 @@ void blk_mq_sysfs_unregister_hctxs(struct request_queue *q) struct blk_mq_hw_ctx *hctx; unsigned long i; - lockdep_assert_held(&q->sysfs_dir_lock); - + mutex_lock(&q->sysfs_dir_lock); if (!q->mq_sysfs_init_done) - return; + goto unlock; queue_for_each_hw_ctx(q, hctx, i) blk_mq_unregister_hctx(hctx); + +unlock: + mutex_unlock(&q->sysfs_dir_lock); } int blk_mq_sysfs_register_hctxs(struct request_queue *q) @@ -290,10 +292,9 @@ int blk_mq_sysfs_register_hctxs(struct request_queue *q) unsigned long i; int ret = 0; - lockdep_assert_held(&q->sysfs_dir_lock); - + mutex_lock(&q->sysfs_dir_lock); if (!q->mq_sysfs_init_done) - return ret; + goto unlock; queue_for_each_hw_ctx(q, hctx, i) { ret = blk_mq_register_hctx(hctx); @@ -301,5 +302,8 @@ int blk_mq_sysfs_register_hctxs(struct request_queue *q) break; } +unlock: + mutex_unlock(&q->sysfs_dir_lock); + return ret; } diff --git a/block/blk-mq.c b/block/blk-mq.c index 6b6111513986..92e8ddf34575 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -4453,8 +4453,7 @@ static void blk_mq_realloc_hw_ctxs(struct blk_mq_tag_set *set, unsigned long i, j; /* protect against switching io scheduler */ - lockdep_assert_held(&q->sysfs_lock); - + mutex_lock(&q->sysfs_lock); for (i = 0; i < set->nr_hw_queues; i++) { int old_node; int node = blk_mq_get_hctx_node(set, i); @@ -4487,6 +4486,7 @@ static void blk_mq_realloc_hw_ctxs(struct blk_mq_tag_set *set, xa_for_each_start(&q->hctx_table, j, hctx, j) blk_mq_exit_hctx(q, set, hctx, j); + mutex_unlock(&q->sysfs_lock); /* unregister cpuhp callbacks for exited hctxs */ blk_mq_remove_hw_queues_cpuhp(q); @@ -4518,14 +4518,10 @@ int blk_mq_init_allocated_queue(struct blk_mq_tag_set *set, xa_init(&q->hctx_table); - mutex_lock(&q->sysfs_lock); - blk_mq_realloc_hw_ctxs(set, q); if (!q->nr_hw_queues) goto err_hctxs; - mutex_unlock(&q->sysfs_lock); - INIT_WORK(&q->timeout_work, blk_mq_timeout_work); blk_queue_rq_timeout(q, set->timeout ? set->timeout : 30 * HZ); @@ -4544,7 +4540,6 @@ int blk_mq_init_allocated_queue(struct blk_mq_tag_set *set, return 0; err_hctxs: - mutex_unlock(&q->sysfs_lock); blk_mq_release(q); err_exit: q->mq_ops = NULL; @@ -4925,12 +4920,12 @@ static bool blk_mq_elv_switch_none(struct list_head *head, return false; /* q->elevator needs protection from ->sysfs_lock */ - lockdep_assert_held(&q->sysfs_lock); + mutex_lock(&q->sysfs_lock); /* the check has to be done with holding sysfs_lock */ if (!q->elevator) { kfree(qe); - goto out; + goto unlock; } INIT_LIST_HEAD(&qe->node); @@ -4940,7 +4935,9 @@ static bool blk_mq_elv_switch_none(struct list_head *head, __elevator_get(qe->type); list_add(&qe->node, head); elevator_disable(q); -out: +unlock: + mutex_unlock(&q->sysfs_lock); + return true; } @@ -4969,9 +4966,11 @@ static void blk_mq_elv_switch_back(struct list_head *head, list_del(&qe->node); kfree(qe); + mutex_lock(&q->sysfs_lock); elevator_switch(q, t); /* drop the reference acquired in blk_mq_elv_switch_none */ elevator_put(t); + mutex_unlock(&q->sysfs_lock); } static void __blk_mq_update_nr_hw_queues(struct blk_mq_tag_set *set, @@ -4991,11 +4990,8 @@ static void __blk_mq_update_nr_hw_queues(struct blk_mq_tag_set *set, if (set->nr_maps == 1 && nr_hw_queues == set->nr_hw_queues) return; - list_for_each_entry(q, &set->tag_list, tag_set_list) { - mutex_lock(&q->sysfs_dir_lock); - mutex_lock(&q->sysfs_lock); + list_for_each_entry(q, &set->tag_list, tag_set_list) blk_mq_freeze_queue(q); - } /* * Switch IO scheduler to 'none', cleaning up the data associated * with the previous scheduler. We will switch back once we are done @@ -5051,11 +5047,8 @@ static void __blk_mq_update_nr_hw_queues(struct blk_mq_tag_set *set, list_for_each_entry(q, &set->tag_list, tag_set_list) blk_mq_elv_switch_back(&head, q); - list_for_each_entry(q, &set->tag_list, tag_set_list) { + list_for_each_entry(q, &set->tag_list, tag_set_list) blk_mq_unfreeze_queue(q); - mutex_unlock(&q->sysfs_lock); - mutex_unlock(&q->sysfs_dir_lock); - } /* Free the excess tags when nr_hw_queues shrink. */ for (i = set->nr_hw_queues; i < prev_nr_hw_queues; i++) diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c index 64f70c713d2f..767598e719ab 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c @@ -706,11 +706,11 @@ queue_attr_store(struct kobject *kobj, struct attribute *attr, if (entry->load_module) entry->load_module(disk, page, length); - mutex_lock(&q->sysfs_lock); blk_mq_freeze_queue(q); + mutex_lock(&q->sysfs_lock); res = entry->store(disk, page, length); - blk_mq_unfreeze_queue(q); mutex_unlock(&q->sysfs_lock); + blk_mq_unfreeze_queue(q); return res; } -- 2.47.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] block: Revert "block: Fix potential deadlock while freezing queue and acquiring sysfs_lock" 2024-12-18 10:16 ` [PATCH 1/2] block: Revert "block: Fix potential deadlock while freezing queue and acquiring sysfs_lock" Ming Lei @ 2024-12-20 10:23 ` Nilay Shroff 2024-12-20 15:09 ` Jens Axboe 0 siblings, 1 reply; 9+ messages in thread From: Nilay Shroff @ 2024-12-20 10:23 UTC (permalink / raw) To: Ming Lei, Jens Axboe, linux-block On 12/18/24 15:46, Ming Lei wrote: > This reverts commit be26ba96421ab0a8fa2055ccf7db7832a13c44d2. > > Commit be26ba96421a ("block: Fix potential deadlock while freezing queue and > acquiring sysfs_loc") actually reverts commit 22465bbac53c ("blk-mq: move cpuhp > callback registering out of q->sysfs_lock"), and causes the original resctrl > lockdep warning. > > So revert it and we need to fix the issue in another way. > Hi Ming, Can we wait here for some more time before we revert this as this is currently being discussed[1] and we don't know yet how we may fix it? [1]https://lore.kernel.org/all/20241219061514.GA19575@lst.de/ Thanks, --Nilay ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] block: Revert "block: Fix potential deadlock while freezing queue and acquiring sysfs_lock" 2024-12-20 10:23 ` Nilay Shroff @ 2024-12-20 15:09 ` Jens Axboe 2024-12-20 15:18 ` Nilay Shroff 2024-12-20 15:24 ` Ming Lei 0 siblings, 2 replies; 9+ messages in thread From: Jens Axboe @ 2024-12-20 15:09 UTC (permalink / raw) To: Nilay Shroff, Ming Lei, linux-block On 12/20/24 3:23 AM, Nilay Shroff wrote: > On 12/18/24 15:46, Ming Lei wrote: >> This reverts commit be26ba96421ab0a8fa2055ccf7db7832a13c44d2. >> >> Commit be26ba96421a ("block: Fix potential deadlock while freezing queue and >> acquiring sysfs_loc") actually reverts commit 22465bbac53c ("blk-mq: move cpuhp >> callback registering out of q->sysfs_lock"), and causes the original resctrl >> lockdep warning. >> >> So revert it and we need to fix the issue in another way. >> > Hi Ming, > > Can we wait here for some more time before we revert this as this is > currently being discussed[1] and we don't know yet how we may fix it? > > [1]https://lore.kernel.org/all/20241219061514.GA19575@lst.de/ It's already queued up and will go out today. Doesn't exclude people working on solving this for real. -- Jens Axboe ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] block: Revert "block: Fix potential deadlock while freezing queue and acquiring sysfs_lock" 2024-12-20 15:09 ` Jens Axboe @ 2024-12-20 15:18 ` Nilay Shroff 2024-12-20 15:24 ` Ming Lei 1 sibling, 0 replies; 9+ messages in thread From: Nilay Shroff @ 2024-12-20 15:18 UTC (permalink / raw) To: Jens Axboe, Ming Lei, linux-block On 12/20/24 20:39, Jens Axboe wrote: > On 12/20/24 3:23 AM, Nilay Shroff wrote: >> On 12/18/24 15:46, Ming Lei wrote: >>> This reverts commit be26ba96421ab0a8fa2055ccf7db7832a13c44d2. >>> >>> Commit be26ba96421a ("block: Fix potential deadlock while freezing queue and >>> acquiring sysfs_loc") actually reverts commit 22465bbac53c ("blk-mq: move cpuhp >>> callback registering out of q->sysfs_lock"), and causes the original resctrl >>> lockdep warning. >>> >>> So revert it and we need to fix the issue in another way. >>> >> Hi Ming, >> >> Can we wait here for some more time before we revert this as this is >> currently being discussed[1] and we don't know yet how we may fix it? >> >> [1]https://lore.kernel.org/all/20241219061514.GA19575@lst.de/ > > It's already queued up and will go out today. Doesn't exclude people > working on solving this for real. > Sure, my bad. I will ensure this in future. Thanks, --Nilay ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] block: Revert "block: Fix potential deadlock while freezing queue and acquiring sysfs_lock" 2024-12-20 15:09 ` Jens Axboe 2024-12-20 15:18 ` Nilay Shroff @ 2024-12-20 15:24 ` Ming Lei 2024-12-21 12:31 ` Nilay Shroff 1 sibling, 1 reply; 9+ messages in thread From: Ming Lei @ 2024-12-20 15:24 UTC (permalink / raw) To: Jens Axboe; +Cc: Nilay Shroff, linux-block On Fri, Dec 20, 2024 at 11:10 PM Jens Axboe <axboe@kernel.dk> wrote: > > On 12/20/24 3:23 AM, Nilay Shroff wrote: > > On 12/18/24 15:46, Ming Lei wrote: > >> This reverts commit be26ba96421ab0a8fa2055ccf7db7832a13c44d2. > >> > >> Commit be26ba96421a ("block: Fix potential deadlock while freezing queue and > >> acquiring sysfs_loc") actually reverts commit 22465bbac53c ("blk-mq: move cpuhp > >> callback registering out of q->sysfs_lock"), and causes the original resctrl > >> lockdep warning. > >> > >> So revert it and we need to fix the issue in another way. > >> > > Hi Ming, > > > > Can we wait here for some more time before we revert this as this is > > currently being discussed[1] and we don't know yet how we may fix it? > > > > [1]https://lore.kernel.org/all/20241219061514.GA19575@lst.de/ > > It's already queued up and will go out today. Doesn't exclude people > working on solving this for real. IMO, it is correct to cut the dependency between q->sysfs_lock and global cpu hotplug lock, otherwise more subsystems can be involved, so let's revert it first. Christoph is also working on q->sysfs_lock warning, and we can try to figure out other solutions given the involved(or most of) locks should be from block layer internal. https://lore.kernel.org/linux-block/20241219061514.GA19575@lst.de/ Thanks, Ming ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] block: Revert "block: Fix potential deadlock while freezing queue and acquiring sysfs_lock" 2024-12-20 15:24 ` Ming Lei @ 2024-12-21 12:31 ` Nilay Shroff 0 siblings, 0 replies; 9+ messages in thread From: Nilay Shroff @ 2024-12-21 12:31 UTC (permalink / raw) To: Ming Lei, Jens Axboe; +Cc: linux-block On 12/20/24 20:54, Ming Lei wrote: > On Fri, Dec 20, 2024 at 11:10 PM Jens Axboe <axboe@kernel.dk> wrote: >> >> On 12/20/24 3:23 AM, Nilay Shroff wrote: >>> On 12/18/24 15:46, Ming Lei wrote: >>>> This reverts commit be26ba96421ab0a8fa2055ccf7db7832a13c44d2. >>>> >>>> Commit be26ba96421a ("block: Fix potential deadlock while freezing queue and >>>> acquiring sysfs_loc") actually reverts commit 22465bbac53c ("blk-mq: move cpuhp >>>> callback registering out of q->sysfs_lock"), and causes the original resctrl >>>> lockdep warning. >>>> >>>> So revert it and we need to fix the issue in another way. >>>> >>> Hi Ming, >>> >>> Can we wait here for some more time before we revert this as this is >>> currently being discussed[1] and we don't know yet how we may fix it? >>> >>> [1]https://lore.kernel.org/all/20241219061514.GA19575@lst.de/ >> >> It's already queued up and will go out today. Doesn't exclude people >> working on solving this for real. > > IMO, it is correct to cut the dependency between q->sysfs_lock and > global cpu hotplug lock, otherwise more subsystems can be involved, > so let's revert it first. > Yeah agreed, we may want to in that case just remove lockdep aseert of q->sysfs_lock from blk_mq_realloc_hw_ctxs() and also remove q->sysfs_lock from blk_mq_init_allocated_queue(). But that's ok. Lets see how we'd pursue further and solve other limits-lock and queue-freeze issue. > Christoph is also working on q->sysfs_lock warning, and we can try to > figure out other solutions given the involved(or most of) locks should be > from block layer internal. > > https://lore.kernel.org/linux-block/20241219061514.GA19575@lst.de/ > Thanks, --Nilay ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 2/2] block: avoid to reuse `hctx` not removed from cpuhp callback list 2024-12-18 10:16 [PATCH 0/2] block: fix two regressions in v6.13 dev cycle Ming Lei 2024-12-18 10:16 ` [PATCH 1/2] block: Revert "block: Fix potential deadlock while freezing queue and acquiring sysfs_lock" Ming Lei @ 2024-12-18 10:16 ` Ming Lei 2024-12-18 14:25 ` [PATCH 0/2] block: fix two regressions in v6.13 dev cycle Jens Axboe 2 siblings, 0 replies; 9+ messages in thread From: Ming Lei @ 2024-12-18 10:16 UTC (permalink / raw) To: Jens Axboe, linux-block; +Cc: Ming Lei, kernel test robot If the 'hctx' isn't removed from cpuhp callback list, we can't reuse it, otherwise use-after-free may be triggered. Reported-by: kernel test robot <oliver.sang@intel.com> Closes: https://lore.kernel.org/oe-lkp/202412172217.b906db7c-lkp@intel.com Tested-by: kernel test robot <oliver.sang@intel.com> Fixes: 22465bbac53c ("blk-mq: move cpuhp callback registering out of q->sysfs_lock") Signed-off-by: Ming Lei <ming.lei@redhat.com> --- block/blk-mq.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/block/blk-mq.c b/block/blk-mq.c index 92e8ddf34575..8ac19d4ae3c0 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -4412,6 +4412,15 @@ struct gendisk *blk_mq_alloc_disk_for_queue(struct request_queue *q, } EXPORT_SYMBOL(blk_mq_alloc_disk_for_queue); +/* + * Only hctx removed from cpuhp list can be reused + */ +static bool blk_mq_hctx_is_reusable(struct blk_mq_hw_ctx *hctx) +{ + return hlist_unhashed(&hctx->cpuhp_online) && + hlist_unhashed(&hctx->cpuhp_dead); +} + static struct blk_mq_hw_ctx *blk_mq_alloc_and_init_hctx( struct blk_mq_tag_set *set, struct request_queue *q, int hctx_idx, int node) @@ -4421,7 +4430,7 @@ static struct blk_mq_hw_ctx *blk_mq_alloc_and_init_hctx( /* reuse dead hctx first */ spin_lock(&q->unused_hctx_lock); list_for_each_entry(tmp, &q->unused_hctx_list, hctx_list) { - if (tmp->numa_node == node) { + if (tmp->numa_node == node && blk_mq_hctx_is_reusable(tmp)) { hctx = tmp; break; } -- 2.47.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 0/2] block: fix two regressions in v6.13 dev cycle 2024-12-18 10:16 [PATCH 0/2] block: fix two regressions in v6.13 dev cycle Ming Lei 2024-12-18 10:16 ` [PATCH 1/2] block: Revert "block: Fix potential deadlock while freezing queue and acquiring sysfs_lock" Ming Lei 2024-12-18 10:16 ` [PATCH 2/2] block: avoid to reuse `hctx` not removed from cpuhp callback list Ming Lei @ 2024-12-18 14:25 ` Jens Axboe 2 siblings, 0 replies; 9+ messages in thread From: Jens Axboe @ 2024-12-18 14:25 UTC (permalink / raw) To: linux-block, Ming Lei On Wed, 18 Dec 2024 18:16:13 +0800, Ming Lei wrote: > Fixes two regressions introduced recently. > > Thanks, > > Ming Lei (2): > block: Revert "block: Fix potential deadlock while freezing queue and > acquiring sysfs_lock" > block: avoid to reuse `hctx` not removed from cpuhp callback list > > [...] Applied, thanks! [1/2] block: Revert "block: Fix potential deadlock while freezing queue and acquiring sysfs_lock" commit: 224749be6c23efe7fb8a030854f4fc5d1dd813b3 [2/2] block: avoid to reuse `hctx` not removed from cpuhp callback list commit: 85672ca9ceeaa1dcf2777a7048af5f4aee3fd02b Best regards, -- Jens Axboe ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2024-12-21 12:31 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-12-18 10:16 [PATCH 0/2] block: fix two regressions in v6.13 dev cycle Ming Lei 2024-12-18 10:16 ` [PATCH 1/2] block: Revert "block: Fix potential deadlock while freezing queue and acquiring sysfs_lock" Ming Lei 2024-12-20 10:23 ` Nilay Shroff 2024-12-20 15:09 ` Jens Axboe 2024-12-20 15:18 ` Nilay Shroff 2024-12-20 15:24 ` Ming Lei 2024-12-21 12:31 ` Nilay Shroff 2024-12-18 10:16 ` [PATCH 2/2] block: avoid to reuse `hctx` not removed from cpuhp callback list Ming Lei 2024-12-18 14:25 ` [PATCH 0/2] block: fix two regressions in v6.13 dev cycle Jens Axboe
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox