diff options
| author | Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> | 2026-05-28 20:14:44 +0900 |
|---|---|---|
| committer | Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> | 2026-05-28 20:14:44 +0900 |
| commit | c2245c765ebeba9dcb924d9171d8d470a9ac41c8 (patch) | |
| tree | 3a10234e43c40746eb45e8d69b64fce775d549c8 /block | |
| parent | 86bfdc2e5836cba4be80294234e5679edee52a0c (diff) | |
| download | linux-next-history-c2245c765ebeba9dcb924d9171d8d470a9ac41c8.tar.gz | |
block: assign caller-specific lockdep class to disk->open_mutex
This is an experimental patch for testing.
The block core currently allocates a single monolithic lockdep key for
disk->open_mutex across all callers. This single key seems to conflate
locking hierarchies between independent block streams, and might be
the cause of circular dependency lockdep splats.
Let's see whether assigning caller-specific lockdep class to
disk->open_mutex helps avoiding circular dependency lockdep splats.
Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Diffstat (limited to 'block')
| -rw-r--r-- | block/blk-mq.c | 4 | ||||
| -rw-r--r-- | block/blk.h | 2 | ||||
| -rw-r--r-- | block/genhd.c | 8 |
3 files changed, 7 insertions, 7 deletions
diff --git a/block/blk-mq.c b/block/blk-mq.c index 28c2d931e75ea..01a15ac40754a 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -4492,7 +4492,7 @@ EXPORT_SYMBOL(blk_mq_destroy_queue); struct gendisk *__blk_mq_alloc_disk(struct blk_mq_tag_set *set, struct queue_limits *lim, void *queuedata, - struct lock_class_key *lkclass) + struct lock_class_key lkclass[2]) { struct request_queue *q; struct gendisk *disk; @@ -4513,7 +4513,7 @@ struct gendisk *__blk_mq_alloc_disk(struct blk_mq_tag_set *set, EXPORT_SYMBOL(__blk_mq_alloc_disk); struct gendisk *blk_mq_alloc_disk_for_queue(struct request_queue *q, - struct lock_class_key *lkclass) + struct lock_class_key lkclass[2]) { struct gendisk *disk; diff --git a/block/blk.h b/block/blk.h index b998a7761faf3..1744748f9b68d 100644 --- a/block/blk.h +++ b/block/blk.h @@ -614,7 +614,7 @@ void drop_partition(struct block_device *part); void bdev_set_nr_sectors(struct block_device *bdev, sector_t sectors); struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id, - struct lock_class_key *lkclass); + struct lock_class_key lkclass[2]); struct request_queue *blk_alloc_queue(struct queue_limits *lim, int node_id); int disk_scan_partitions(struct gendisk *disk, blk_mode_t mode); diff --git a/block/genhd.c b/block/genhd.c index 7d6854fd28e95..303bd5e619e70 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -1444,7 +1444,7 @@ dev_t part_devt(struct gendisk *disk, u8 partno) } struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id, - struct lock_class_key *lkclass) + struct lock_class_key lkclass[2]) { struct gendisk *disk; @@ -1467,7 +1467,7 @@ struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id, goto out_free_bdi; disk->node_id = node_id; - mutex_init(&disk->open_mutex); + mutex_init_with_key(&disk->open_mutex, &lkclass[1]); xa_init(&disk->part_tbl); if (xa_insert(&disk->part_tbl, 0, disk->part0, GFP_KERNEL)) goto out_destroy_part_tbl; @@ -1482,7 +1482,7 @@ struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id, device_initialize(disk_to_dev(disk)); inc_diskseq(disk); q->disk = disk; - lockdep_init_map(&disk->lockdep_map, "(bio completion)", lkclass, 0); + lockdep_init_map(&disk->lockdep_map, "(bio completion)", &lkclass[0], 0); #ifdef CONFIG_BLOCK_HOLDER_DEPRECATED INIT_LIST_HEAD(&disk->slave_bdevs); #endif @@ -1506,7 +1506,7 @@ out_free_disk: } struct gendisk *__blk_alloc_disk(struct queue_limits *lim, int node, - struct lock_class_key *lkclass) + struct lock_class_key lkclass[2]) { struct queue_limits default_lim = { }; struct request_queue *q; |
