diff options
author | Christoph Hellwig <hch@lst.de> | 2016-09-14 16:18:55 +0200 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2016-09-15 08:42:03 -0600 |
commit | da695ba236b993f07a540d35c17f271ef08c89f3 (patch) | |
tree | bcf5c0624f3e3889b8c1284f1965cf90b265b78e /block/blk-mq.c | |
parent | 7d7e0f90b70f6c5367c2d1c9a7e87dd228bd0816 (diff) |
blk-mq: allow the driver to pass in a queue mapping
This allows drivers specify their own queue mapping by overriding the
setup-time function that builds the mq_map. This can be used for
example to build the map based on the MSI-X vector mapping provided
by the core interrupt layer for PCI devices.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Keith Busch <keith.busch@intel.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block/blk-mq.c')
-rw-r--r-- | block/blk-mq.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/block/blk-mq.c b/block/blk-mq.c index 6e077a9d61a8..a3060078a8da 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -2286,6 +2286,8 @@ EXPORT_SYMBOL_GPL(blk_mq_tags_cpumask); */ int blk_mq_alloc_tag_set(struct blk_mq_tag_set *set) { + int ret; + BUILD_BUG_ON(BLK_MQ_MAX_DEPTH > 1 << BLK_MQ_UNIQUE_TAG_BITS); if (!set->nr_hw_queues) @@ -2324,11 +2326,21 @@ int blk_mq_alloc_tag_set(struct blk_mq_tag_set *set) if (!set->tags) return -ENOMEM; - set->mq_map = blk_mq_make_queue_map(set); + ret = -ENOMEM; + set->mq_map = kzalloc_node(sizeof(*set->mq_map) * nr_cpu_ids, + GFP_KERNEL, set->numa_node); if (!set->mq_map) goto out_free_tags; - if (blk_mq_alloc_rq_maps(set)) + if (set->ops->map_queues) + ret = set->ops->map_queues(set); + else + ret = blk_mq_map_queues(set); + if (ret) + goto out_free_mq_map; + + ret = blk_mq_alloc_rq_maps(set); + if (ret) goto out_free_mq_map; mutex_init(&set->tag_list_lock); @@ -2342,7 +2354,7 @@ out_free_mq_map: out_free_tags: kfree(set->tags); set->tags = NULL; - return -ENOMEM; + return ret; } EXPORT_SYMBOL(blk_mq_alloc_tag_set); |