Skip to content

Commit 4d80513

Browse files
Ming Leiaxboe
authored andcommitted
blk-mq: figure out correct numa node for hw queue
The current code always uses default queue map and hw queue index for figuring out the numa node for hw queue, this way isn't correct because blk-mq supports three queue maps, and the correct queue map should be used for the specified hw queue. Reviewed-by: Hannes Reinecke <hare@suse.de> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Ming Lei <ming.lei@redhat.com> Link: https://lore.kernel.org/r/20220308073219.91173-2-ming.lei@redhat.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent 15729ff commit 4d80513

File tree

1 file changed

+30
-6
lines changed

1 file changed

+30
-6
lines changed

block/blk-mq.c

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3107,15 +3107,41 @@ void blk_mq_free_rq_map(struct blk_mq_tags *tags)
31073107
blk_mq_free_tags(tags);
31083108
}
31093109

3110+
static enum hctx_type hctx_idx_to_type(struct blk_mq_tag_set *set,
3111+
unsigned int hctx_idx)
3112+
{
3113+
int i;
3114+
3115+
for (i = 0; i < set->nr_maps; i++) {
3116+
unsigned int start = set->map[i].queue_offset;
3117+
unsigned int end = start + set->map[i].nr_queues;
3118+
3119+
if (hctx_idx >= start && hctx_idx < end)
3120+
break;
3121+
}
3122+
3123+
if (i >= set->nr_maps)
3124+
i = HCTX_TYPE_DEFAULT;
3125+
3126+
return i;
3127+
}
3128+
3129+
static int blk_mq_get_hctx_node(struct blk_mq_tag_set *set,
3130+
unsigned int hctx_idx)
3131+
{
3132+
enum hctx_type type = hctx_idx_to_type(set, hctx_idx);
3133+
3134+
return blk_mq_hw_queue_to_node(&set->map[type], hctx_idx);
3135+
}
3136+
31103137
static struct blk_mq_tags *blk_mq_alloc_rq_map(struct blk_mq_tag_set *set,
31113138
unsigned int hctx_idx,
31123139
unsigned int nr_tags,
31133140
unsigned int reserved_tags)
31143141
{
3142+
int node = blk_mq_get_hctx_node(set, hctx_idx);
31153143
struct blk_mq_tags *tags;
3116-
int node;
31173144

3118-
node = blk_mq_hw_queue_to_node(&set->map[HCTX_TYPE_DEFAULT], hctx_idx);
31193145
if (node == NUMA_NO_NODE)
31203146
node = set->numa_node;
31213147

@@ -3164,10 +3190,9 @@ static int blk_mq_alloc_rqs(struct blk_mq_tag_set *set,
31643190
unsigned int hctx_idx, unsigned int depth)
31653191
{
31663192
unsigned int i, j, entries_per_page, max_order = 4;
3193+
int node = blk_mq_get_hctx_node(set, hctx_idx);
31673194
size_t rq_size, left;
3168-
int node;
31693195

3170-
node = blk_mq_hw_queue_to_node(&set->map[HCTX_TYPE_DEFAULT], hctx_idx);
31713196
if (node == NUMA_NO_NODE)
31723197
node = set->numa_node;
31733198

@@ -3941,10 +3966,9 @@ static void blk_mq_realloc_hw_ctxs(struct blk_mq_tag_set *set,
39413966
/* protect against switching io scheduler */
39423967
mutex_lock(&q->sysfs_lock);
39433968
for (i = 0; i < set->nr_hw_queues; i++) {
3944-
int node;
3969+
int node = blk_mq_get_hctx_node(set, i);
39453970
struct blk_mq_hw_ctx *hctx;
39463971

3947-
node = blk_mq_hw_queue_to_node(&set->map[HCTX_TYPE_DEFAULT], i);
39483972
/*
39493973
* If the hw queue has been mapped to another numa node,
39503974
* we need to realloc the hctx. If allocation fails, fallback

0 commit comments

Comments
 (0)