Skip to content

Commit 1c357a1

Browse files
committed
dm: allocate blk_mq_tag_set rather than embed in mapped_device
The blk_mq_tag_set is only needed for dm-mq support. There is point wasting space in 'struct mapped_device' for non-dm-mq devices. Signed-off-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> # check kzalloc return
1 parent faad87d commit 1c357a1

File tree

1 file changed

+27
-18
lines changed

1 file changed

+27
-18
lines changed

drivers/md/dm.c

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ struct mapped_device {
223223
ktime_t last_rq_start_time;
224224

225225
/* for blk-mq request-based DM support */
226-
struct blk_mq_tag_set tag_set;
226+
struct blk_mq_tag_set *tag_set;
227227
bool use_blk_mq;
228228
};
229229

@@ -2388,8 +2388,10 @@ static void free_dev(struct mapped_device *md)
23882388
unlock_fs(md);
23892389

23902390
cleanup_mapped_device(md);
2391-
if (md->use_blk_mq)
2392-
blk_mq_free_tag_set(&md->tag_set);
2391+
if (md->tag_set) {
2392+
blk_mq_free_tag_set(md->tag_set);
2393+
kfree(md->tag_set);
2394+
}
23932395

23942396
free_table_devices(&md->table_devices);
23952397
dm_stats_cleanup(&md->stats);
@@ -2710,24 +2712,28 @@ static int dm_init_request_based_blk_mq_queue(struct mapped_device *md)
27102712
struct request_queue *q;
27112713
int err;
27122714

2713-
memset(&md->tag_set, 0, sizeof(md->tag_set));
2714-
md->tag_set.ops = &dm_mq_ops;
2715-
md->tag_set.queue_depth = dm_get_blk_mq_queue_depth();
2716-
md->tag_set.numa_node = NUMA_NO_NODE;
2717-
md->tag_set.flags = BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_SG_MERGE;
2718-
md->tag_set.nr_hw_queues = dm_get_blk_mq_nr_hw_queues();
2715+
md->tag_set = kzalloc(sizeof(struct blk_mq_tag_set), GFP_KERNEL);
2716+
if (!md->tag_set)
2717+
return -ENOMEM;
2718+
2719+
md->tag_set->ops = &dm_mq_ops;
2720+
md->tag_set->queue_depth = dm_get_blk_mq_queue_depth();
2721+
md->tag_set->numa_node = NUMA_NO_NODE;
2722+
md->tag_set->flags = BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_SG_MERGE;
2723+
md->tag_set->nr_hw_queues = dm_get_blk_mq_nr_hw_queues();
2724+
md->tag_set->driver_data = md;
2725+
2726+
md->tag_set->cmd_size = sizeof(struct dm_rq_target_io);
27192727
if (md_type == DM_TYPE_REQUEST_BASED) {
2720-
/* make the memory for non-blk-mq clone part of the pdu */
2721-
md->tag_set.cmd_size = sizeof(struct dm_rq_target_io) + sizeof(struct request);
2722-
} else
2723-
md->tag_set.cmd_size = sizeof(struct dm_rq_target_io);
2724-
md->tag_set.driver_data = md;
2728+
/* put the memory for non-blk-mq clone at the end of the pdu */
2729+
md->tag_set->cmd_size += sizeof(struct request);
2730+
}
27252731

2726-
err = blk_mq_alloc_tag_set(&md->tag_set);
2732+
err = blk_mq_alloc_tag_set(md->tag_set);
27272733
if (err)
2728-
return err;
2734+
goto out_kfree_tag_set;
27292735

2730-
q = blk_mq_init_allocated_queue(&md->tag_set, md->queue);
2736+
q = blk_mq_init_allocated_queue(md->tag_set, md->queue);
27312737
if (IS_ERR(q)) {
27322738
err = PTR_ERR(q);
27332739
goto out_tag_set;
@@ -2744,7 +2750,10 @@ static int dm_init_request_based_blk_mq_queue(struct mapped_device *md)
27442750
return 0;
27452751

27462752
out_tag_set:
2747-
blk_mq_free_tag_set(&md->tag_set);
2753+
blk_mq_free_tag_set(md->tag_set);
2754+
out_kfree_tag_set:
2755+
kfree(md->tag_set);
2756+
27482757
return err;
27492758
}
27502759

0 commit comments

Comments
 (0)