blk-mq: Avoid memoryless numa node encoded in hctx numa_node
authorRaghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
Wed, 2 Dec 2015 11:29:05 +0000 (16:59 +0530)
committerJens Axboe <axboe@fb.com>
Thu, 3 Dec 2015 16:56:27 +0000 (09:56 -0700)
In architecture like powerpc, we can have cpus without any local memory
attached to it (a.k.a memoryless nodes). In such cases cpu to node mapping
can result in memory allocation hints for block hctx->numa_node populated
with node values which does not have real memory.

Instead use local_memory_node(), which is guaranteed to have memory.
local_memory_node is a noop in other architectures that does not support
memoryless nodes.

Signed-off-by: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
Reviewed-by: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
block/blk-mq-cpumap.c
block/blk-mq.c

index 8764c241e5bb44858e753b75f6c102c06a927171..d0634bcf322f1f2a096d9d3abb4ae7f1286e73b4 100644 (file)
@@ -113,7 +113,7 @@ int blk_mq_hw_queue_to_node(unsigned int *mq_map, unsigned int index)
 
        for_each_possible_cpu(i) {
                if (index == mq_map[i])
-                       return cpu_to_node(i);
+                       return local_memory_node(cpu_to_node(i));
        }
 
        return NUMA_NO_NODE;
index 35da31841edaf1f4a384c2eb1a8d22194341cf4e..6889d7183a2ac1ec31d4132b03647191f8e4ed3a 100644 (file)
@@ -1790,7 +1790,7 @@ static void blk_mq_init_cpu_queues(struct request_queue *q,
                 * not, we remain on the home node of the device
                 */
                if (nr_hw_queues > 1 && hctx->numa_node == NUMA_NO_NODE)
-                       hctx->numa_node = cpu_to_node(i);
+                       hctx->numa_node = local_memory_node(cpu_to_node(i));
        }
 }