diff mbox

blk-mq: provide an explicit n:1 mapping for single queue devices

Message ID 20170726201934.4940-1-hch@lst.de (mailing list archive)
State New, archived
Headers show

Commit Message

Christoph Hellwig July 26, 2017, 8:19 p.m. UTC
This avoids having to deal with the nr_hw_queues = 1 case in the various
queue mapping helpers by special casing it in the blk-mq core.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reported-by: Shaohua Li <shli@kernel.org>
---
 block/blk-mq.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

Comments

Jens Axboe July 26, 2017, 8:40 p.m. UTC | #1
On 07/26/2017 02:19 PM, Christoph Hellwig wrote:
> This avoids having to deal with the nr_hw_queues = 1 case in the various
> queue mapping helpers by special casing it in the blk-mq core.

Why special case it at all? If ->map_queues() is properly written,
the single queue case should just fall out naturally. I don't see
why 1 should be any different than 2, 4, or N.
Christoph Hellwig July 27, 2017, 1:26 p.m. UTC | #2
On Wed, Jul 26, 2017 at 02:40:50PM -0600, Jens Axboe wrote:
> On 07/26/2017 02:19 PM, Christoph Hellwig wrote:
> > This avoids having to deal with the nr_hw_queues = 1 case in the various
> > queue mapping helpers by special casing it in the blk-mq core.
> 
> Why special case it at all? If ->map_queues() is properly written,
> the single queue case should just fall out naturally. I don't see
> why 1 should be any different than 2, 4, or N.

Because 1 means everything maps to queue 0 and there is no point
in asking any lower layers for a specific mapping.  We could instead
special case it in pci, virtio and the upcoming rdma handler, or
we could just do it once in the core and get same result with less
overhead.
Jens Axboe July 27, 2017, 2:10 p.m. UTC | #3
On 07/27/2017 07:26 AM, Christoph Hellwig wrote:
> On Wed, Jul 26, 2017 at 02:40:50PM -0600, Jens Axboe wrote:
>> On 07/26/2017 02:19 PM, Christoph Hellwig wrote:
>>> This avoids having to deal with the nr_hw_queues = 1 case in the various
>>> queue mapping helpers by special casing it in the blk-mq core.
>>
>> Why special case it at all? If ->map_queues() is properly written,
>> the single queue case should just fall out naturally. I don't see
>> why 1 should be any different than 2, 4, or N.
> 
> Because 1 means everything maps to queue 0 and there is no point
> in asking any lower layers for a specific mapping.  We could instead
> special case it in pci, virtio and the upcoming rdma handler, or
> we could just do it once in the core and get same result with less
> overhead.

Sure, my point is that the nr_queues == 1 case should just naturally
fall out of the mapping function, it's no more special than the other
ones.
diff mbox

Patch

diff --git a/block/blk-mq.c b/block/blk-mq.c
index 041f7b7fa0d6..50d1f069d83b 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -2458,9 +2458,20 @@  static int blk_mq_alloc_rq_maps(struct blk_mq_tag_set *set)
 	return 0;
 }
 
+static int blk_mq_map_single_queue(struct blk_mq_tag_set *set)
+{
+	int cpu;
+
+	for_each_possible_cpu(cpu)
+		set->mq_map[cpu] = 0;
+	return 0;
+}
+
 static int blk_mq_update_queue_map(struct blk_mq_tag_set *set)
 {
-	if (set->ops->map_queues)
+	if (set->nr_hw_queues == 1)
+		return blk_mq_map_single_queue(set);
+	else if (set->ops->map_queues)
 		return set->ops->map_queues(set);
 	else
 		return blk_mq_map_queues(set);