linux-mainline/block
Nilay Shroff 370ac285f2 block: avoid cpu_hotplug_lock depedency on freeze_lock
A recent lockdep[1] splat observed while running blktest block/005
reveals a potential deadlock caused by the cpu_hotplug_lock dependency
on ->freeze_lock. This dependency was introduced by commit 033b667a82
("block: blk-rq-qos: guard rq-qos helpers by static key").

That change added a static key to avoid fetching q->rq_qos when
neither blk-wbt nor blk-iolatency is configured. The static key
dynamically patches kernel text to a NOP when disabled, eliminating
overhead of fetching q->rq_qos in the I/O hot path. However, enabling
a static key at runtime requires acquiring both cpu_hotplug_lock and
jump_label_mutex. When this happens after the queue has already been
frozen (i.e., while holding ->freeze_lock), it creates a locking
dependency from cpu_hotplug_lock to ->freeze_lock, which leads to a
potential deadlock reported by lockdep [1].

To resolve this, replace the static key mechanism with q->queue_flags:
QUEUE_FLAG_QOS_ENABLED. This flag is evaluated in the fast path before
accessing q->rq_qos. If the flag is set, we proceed to fetch q->rq_qos;
otherwise, the access is skipped.

Since q->queue_flags is commonly accessed in IO hotpath and resides in
the first cacheline of struct request_queue, checking it imposes minimal
overhead while eliminating the deadlock risk.

This change avoids the lockdep splat without introducing performance
regressions.

[1] https://lore.kernel.org/linux-block/4fdm37so3o4xricdgfosgmohn63aa7wj3ua4e5vpihoamwg3ui@fq42f5q5t5ic/

Reported-by: Shinichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Closes: https://lore.kernel.org/linux-block/4fdm37so3o4xricdgfosgmohn63aa7wj3ua4e5vpihoamwg3ui@fq42f5q5t5ic/
Fixes: 033b667a82 ("block: blk-rq-qos: guard rq-qos helpers by static key")
Tested-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Signed-off-by: Nilay Shroff <nilay@linux.ibm.com>
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Reviewed-by: Yu Kuai <yukuai3@huawei.com>
Link: https://lore.kernel.org/r/20250814082612.500845-4-nilay@linux.ibm.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2025-08-21 07:11:11 -06:00
..
partitions
badblocks.c
bdev.c xfs: New code for 6.16 2025-05-26 12:56:01 -07:00
bfq-cgroup.c
bfq-iosched.c block, bfq: remove redundant __GFP_NOWARN 2025-08-11 07:59:22 -06:00
bfq-iosched.h lib/sbitmap: convert shallow_depth from one word to the whole sbitmap 2025-08-07 06:30:17 -06:00
bfq-wf2q.c
bio-integrity-auto.c block: rename tuple_size field in blk_integrity to metadata_size 2025-07-01 14:00:14 +02:00
bio-integrity.c block: don't merge different kinds of P2P transfers in a single bio 2025-06-30 15:50:32 -06:00
bio.c Summary of significant series in this pull request: 2025-07-31 14:57:54 -07:00
blk-cgroup-fc-appid.c
blk-cgroup-rwstat.c
blk-cgroup-rwstat.h
blk-cgroup.c blk-cgroup: remove redundant __GFP_NOWARN 2025-08-11 07:59:40 -06:00
blk-cgroup.h
blk-core.c block: tone down bio_check_eod 2025-08-18 13:27:05 -06:00
blk-crypto-fallback.c
blk-crypto-internal.h
blk-crypto-profile.c
blk-crypto-sysfs.c
blk-crypto.c
blk-flush.c
blk-ia-ranges.c
blk-integrity.c block: fix lbmd_guard_tag_type assignment in FS_IOC_GETLBMD_CAP 2025-07-23 14:55:51 +02:00
blk-ioc.c blk-ioc: don't hold queue_lock for ioc_lookup_icq() 2025-07-29 06:26:34 -06:00
blk-iocost.c
blk-iolatency.c treewide, timers: Rename from_timer() to timer_container_of() 2025-06-08 09:07:37 +02:00
blk-ioprio.c
blk-ioprio.h
blk-lib.c
blk-map.c
blk-merge.c block: use plug request list tail for one-shot backmerge attempt 2025-06-11 08:48:46 -06:00
blk-mq-cpumap.c blk-mq: add number of queue calc helper 2025-07-01 10:24:19 -06:00
blk-mq-debugfs.c block: avoid cpu_hotplug_lock depedency on freeze_lock 2025-08-21 07:11:11 -06:00
blk-mq-debugfs.h
blk-mq-dma.c block: add scatterlist-less DMA mapping helpers 2025-06-30 15:50:32 -06:00
blk-mq-sched.c block: fix potential deadlock while running nr_hw_queue update 2025-07-30 06:20:51 -06:00
blk-mq-sched.h block: fix potential deadlock while running nr_hw_queue update 2025-07-30 06:20:51 -06:00
blk-mq-sysfs.c
blk-mq-tag.c
blk-mq.c blk-mq: fix lockdep warning in __blk_mq_update_nr_hw_queues 2025-08-21 05:34:19 -06:00
blk-mq.h
blk-pm.c
blk-pm.h
blk-rq-qos.c block: avoid cpu_hotplug_lock depedency on freeze_lock 2025-08-21 07:11:11 -06:00
blk-rq-qos.h block: avoid cpu_hotplug_lock depedency on freeze_lock 2025-08-21 07:11:11 -06:00
blk-settings.c block: remove newlines from the warnings in blk_validate_integrity_limits 2025-08-18 10:17:49 -06:00
blk-stat.c treewide, timers: Rename from_timer() to timer_container_of() 2025-06-08 09:07:37 +02:00
blk-stat.h
blk-sysfs.c block: restore default wbt enablement 2025-08-13 05:33:48 -06:00
blk-throttle.c treewide, timers: Rename from_timer() to timer_container_of() 2025-06-08 09:07:37 +02:00
blk-throttle.h
blk-timeout.c
blk-wbt.c blk-wbt: Eliminate ambiguity in the comments of struct rq_wb 2025-08-11 10:21:38 -06:00
blk-wbt.h
blk-zoned.c block: add trace messages to zone write plugging 2025-07-15 08:03:49 -06:00
blk.h block: fix kobject double initialization in add_disk 2025-08-11 08:00:49 -06:00
bsg-lib.c
bsg.c
disk-events.c
early-lookup.c
elevator.c block: fix potential deadlock while running nr_hw_queue update 2025-07-30 06:20:51 -06:00
elevator.h block: fix lockdep warning caused by lock dependency in elv_iosched_store 2025-07-30 06:20:51 -06:00
fops.c vfs-6.17-rc1.iomap 2025-07-28 16:09:03 -07:00
genhd.c block: fix kobject double initialization in add_disk 2025-08-11 08:00:49 -06:00
holder.c
ioctl.c vfs-6.17-rc1.integrity 2025-07-28 15:12:00 -07:00
ioprio.c
Kconfig block: Remove obsolete configs BLK_MQ_{PCI,VIRTIO} 2025-05-14 05:43:56 -06:00
Kconfig.iosched
kyber-iosched.c lib/sbitmap: convert shallow_depth from one word to the whole sbitmap 2025-08-07 06:30:17 -06:00
Makefile blk-mq: move the DMA mapping code to a separate file 2025-05-16 08:43:41 -06:00
mq-deadline.c lib/sbitmap: convert shallow_depth from one word to the whole sbitmap 2025-08-07 06:30:17 -06:00
opal_proto.h
sed-opal.c
t10-pi.c block: rename tuple_size field in blk_integrity to metadata_size 2025-07-01 14:00:14 +02:00