Release 4.7 block/blk-mq-cpumap.c
/*
* CPU <-> hardware queue mapping helpers
*
* Copyright (C) 2013-2014 Jens Axboe
*/
#include <linux/kernel.h>
#include <linux/threads.h>
#include <linux/module.h>
#include <linux/mm.h>
#include <linux/smp.h>
#include <linux/cpu.h>
#include <linux/blk-mq.h>
#include "blk.h"
#include "blk-mq.h"
static int cpu_to_queue_index(unsigned int nr_cpus, unsigned int nr_queues,
const int cpu)
{
return cpu * nr_queues / nr_cpus;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
jens axboe | jens axboe | 23 | 92.00% | 1 | 50.00% |
bart van assche | bart van assche | 2 | 8.00% | 1 | 50.00% |
| Total | 25 | 100.00% | 2 | 100.00% |
static int get_first_sibling(unsigned int cpu)
{
unsigned int ret;
ret = cpumask_first(topology_sibling_cpumask(cpu));
if (ret < nr_cpu_ids)
return ret;
return cpu;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
jens axboe | jens axboe | 35 | 97.22% | 1 | 50.00% |
bartosz golaszewski | bartosz golaszewski | 1 | 2.78% | 1 | 50.00% |
| Total | 36 | 100.00% | 2 | 100.00% |
int blk_mq_update_queue_map(unsigned int *map, unsigned int nr_queues,
const struct cpumask *online_mask)
{
unsigned int i, nr_cpus, nr_uniq_cpus, queue, first_sibling;
cpumask_var_t cpus;
if (!alloc_cpumask_var(&cpus, GFP_ATOMIC))
return 1;
cpumask_clear(cpus);
nr_cpus = nr_uniq_cpus = 0;
for_each_cpu(i, online_mask) {
nr_cpus++;
first_sibling = get_first_sibling(i);
if (!cpumask_test_cpu(first_sibling, cpus))
nr_uniq_cpus++;
cpumask_set_cpu(i, cpus);
}
queue = 0;
for_each_possible_cpu(i) {
if (!cpumask_test_cpu(i, online_mask)) {
map[i] = 0;
continue;
}
/*
* Easy case - we have equal or more hardware queues. Or
* there are no thread siblings to take into account. Do
* 1:1 if enough, or sequential mapping if less.
*/
if (nr_queues >= nr_cpus || nr_cpus == nr_uniq_cpus) {
map[i] = cpu_to_queue_index(nr_cpus, nr_queues, queue);
queue++;
continue;
}
/*
* Less then nr_cpus queues, and we have some number of
* threads per cores. Map sibling threads to the same
* queue.
*/
first_sibling = get_first_sibling(i);
if (first_sibling == i) {
map[i] = cpu_to_queue_index(nr_uniq_cpus, nr_queues,
queue);
queue++;
} else
map[i] = map[first_sibling];
}
free_cpumask_var(cpus);
return 0;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
jens axboe | jens axboe | 199 | 94.31% | 1 | 50.00% |
akinobu mita | akinobu mita | 12 | 5.69% | 1 | 50.00% |
| Total | 211 | 100.00% | 2 | 100.00% |
unsigned int *blk_mq_make_queue_map(struct blk_mq_tag_set *set)
{
unsigned int *map;
/* If cpus are offline, map them to first hctx */
map = kzalloc_node(sizeof(*map) * nr_cpu_ids, GFP_KERNEL,
set->numa_node);
if (!map)
return NULL;
if (!blk_mq_update_queue_map(map, set->nr_hw_queues, cpu_online_mask))
return map;
kfree(map);
return NULL;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
jens axboe | jens axboe | 64 | 91.43% | 2 | 50.00% |
christoph hellwig | christoph hellwig | 4 | 5.71% | 1 | 25.00% |
akinobu mita | akinobu mita | 2 | 2.86% | 1 | 25.00% |
| Total | 70 | 100.00% | 4 | 100.00% |
/*
* We have no quick way of doing reverse lookups. This is only used at
* queue init time, so runtime isn't important.
*/
int blk_mq_hw_queue_to_node(unsigned int *mq_map, unsigned int index)
{
int i;
for_each_possible_cpu(i) {
if (index == mq_map[i])
return local_memory_node(cpu_to_node(i));
}
return NUMA_NO_NODE;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
jens axboe | jens axboe | 41 | 93.18% | 1 | 50.00% |
raghavendra k t* (same as raghavendra koushik) | raghavendra k t* (same as raghavendra koushik) | 3 | 6.82% | 1 | 50.00% |
| Total | 44 | 100.00% | 2 | 100.00% |
Overall Contributors
| Person | Tokens | Prop | Commits | CommitProp |
jens axboe | jens axboe | 391 | 94.22% | 4 | 44.44% |
akinobu mita | akinobu mita | 14 | 3.37% | 1 | 11.11% |
christoph hellwig | christoph hellwig | 4 | 0.96% | 1 | 11.11% |
raghavendra k t* (same as raghavendra koushik) | raghavendra k t* (same as raghavendra koushik) | 3 | 0.72% | 1 | 11.11% |
bart van assche | bart van assche | 2 | 0.48% | 1 | 11.11% |
bartosz golaszewski | bartosz golaszewski | 1 | 0.24% | 1 | 11.11% |
| Total | 415 | 100.00% | 9 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.