diff options
author | Bart Van Assche <bvanassche@acm.org> | 2014-12-09 10:59:21 -0500 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2014-12-09 11:08:21 -0500 |
commit | 959f5f5b2fa7ac3bdd37c91076e560c06513f1e6 (patch) | |
tree | a8a58d0da07019e2c75a0e236502cdd81c646336 /block | |
parent | 52f7eb945f2ba62b324bb9ae16d945326a961dcf (diff) |
blk-mq: Use all available hardware queues
Suppose that a system has two CPU sockets, three cores per socket,
that it does not support hyperthreading and that four hardware
queues are provided by a block driver. With the current algorithm
this will lead to the following assignment of CPU cores to hardware
queues:
HWQ 0: 0 1
HWQ 1: 2 3
HWQ 2: 4 5
HWQ 3: (none)
This patch changes the queue assignment into:
HWQ 0: 0 1
HWQ 1: 2
HWQ 2: 3 4
HWQ 3: 5
In other words, this patch has the following three effects:
- All four hardware queues are used instead of only three.
- CPU cores are spread more evenly over hardware queues. For the
above example the range of the number of CPU cores associated
with a single HWQ is reduced from [0..2] to [1..2].
- If the number of HWQ's is a multiple of the number of CPU sockets
it is now guaranteed that all CPU cores associated with a single
HWQ reside on the same CPU socket.
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Sagi Grimberg <sagig@mellanox.com>
Cc: Jens Axboe <axboe@fb.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Ming Lei <ming.lei@canonical.com>
Cc: Alexander Gordeev <agordeev@redhat.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/blk-mq-cpumap.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/block/blk-mq-cpumap.c b/block/blk-mq-cpumap.c index 72e5ed691e37..5f13f4d0bcce 100644 --- a/block/blk-mq-cpumap.c +++ b/block/blk-mq-cpumap.c | |||
@@ -17,7 +17,7 @@ | |||
17 | static int cpu_to_queue_index(unsigned int nr_cpus, unsigned int nr_queues, | 17 | static int cpu_to_queue_index(unsigned int nr_cpus, unsigned int nr_queues, |
18 | const int cpu) | 18 | const int cpu) |
19 | { | 19 | { |
20 | return cpu / ((nr_cpus + nr_queues - 1) / nr_queues); | 20 | return cpu * nr_queues / nr_cpus; |
21 | } | 21 | } |
22 | 22 | ||
23 | static int get_first_sibling(unsigned int cpu) | 23 | static int get_first_sibling(unsigned int cpu) |