summaryrefslogtreecommitdiffstats
path: root/block/blk-mq.h
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2018-10-30 17:36:06 +0100
committerJens Axboe <axboe@kernel.dk>2018-11-07 21:44:59 +0100
commitb3c661b15d5ab11d982e58bee23e05c1780528a1 (patch)
treed9976237d4749482b7948282a1cc08e2e27767d3 /block/blk-mq.h
parentblk-mq: add 'type' attribute to the sysfs hctx directory (diff)
downloadlinux-b3c661b15d5ab11d982e58bee23e05c1780528a1.tar.xz
linux-b3c661b15d5ab11d982e58bee23e05c1780528a1.zip
blk-mq: support multiple hctx maps
Add support for the tag set carrying multiple queue maps, and for the driver to inform blk-mq how many it wishes to support through setting set->nr_maps. This adds an mq_ops helper for drivers that support more than 1 map, mq_ops->rq_flags_to_type(). The function takes request/bio flags and CPU, and returns a queue map index for that. We then use the type information in blk_mq_map_queue() to index the map set. Reviewed-by: Hannes Reinecke <hare@suse.com> Reviewed-by: Keith Busch <keith.busch@intel.com> Reviewed-by: Sagi Grimberg <sagi@grimberg.me> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/blk-mq.h')
-rw-r--r--block/blk-mq.h33
1 files changed, 25 insertions, 8 deletions
diff --git a/block/blk-mq.h b/block/blk-mq.h
index 1821f448f7c4..053862270125 100644
--- a/block/blk-mq.h
+++ b/block/blk-mq.h
@@ -72,20 +72,37 @@ void blk_mq_try_issue_list_directly(struct blk_mq_hw_ctx *hctx,
*/
extern int blk_mq_hw_queue_to_node(struct blk_mq_queue_map *qmap, unsigned int);
-static inline struct blk_mq_hw_ctx *blk_mq_map_queue(struct request_queue *q,
- unsigned int flags,
- unsigned int cpu)
+/*
+ * blk_mq_map_queue_type() - map (hctx_type,cpu) to hardware queue
+ * @q: request queue
+ * @hctx_type: the hctx type index
+ * @cpu: CPU
+ */
+static inline struct blk_mq_hw_ctx *blk_mq_map_queue_type(struct request_queue *q,
+ unsigned int hctx_type,
+ unsigned int cpu)
{
struct blk_mq_tag_set *set = q->tag_set;
- return q->queue_hw_ctx[set->map[0].mq_map[cpu]];
+ return q->queue_hw_ctx[set->map[hctx_type].mq_map[cpu]];
}
-static inline struct blk_mq_hw_ctx *blk_mq_map_queue_type(struct request_queue *q,
- unsigned int hctx_type,
- unsigned int cpu)
+/*
+ * blk_mq_map_queue() - map (cmd_flags,type) to hardware queue
+ * @q: request queue
+ * @flags: request command flags
+ * @cpu: CPU
+ */
+static inline struct blk_mq_hw_ctx *blk_mq_map_queue(struct request_queue *q,
+ unsigned int flags,
+ unsigned int cpu)
{
- return blk_mq_map_queue(q, hctx_type, cpu);
+ int hctx_type = 0;
+
+ if (q->mq_ops->rq_flags_to_type)
+ hctx_type = q->mq_ops->rq_flags_to_type(q, flags);
+
+ return blk_mq_map_queue_type(q, hctx_type, cpu);
}
/*