diff options
author | Matthew Wilcox <matthew.r.wilcox@intel.com> | 2011-03-16 16:52:19 -0400 |
---|---|---|
committer | Matthew Wilcox <matthew.r.wilcox@intel.com> | 2011-11-04 15:53:01 -0400 |
commit | 9ecdc946212f7cd592986b2c519b470404caa6b8 (patch) | |
tree | 5d953e07ff82f8a97b5d4d5c14b0eb6db401d1a2 /drivers/block | |
parent | 3cb967c03926edd2c414082f4cc0feb7b372edae (diff) | |
download | op-kernel-dev-9ecdc946212f7cd592986b2c519b470404caa6b8.zip op-kernel-dev-9ecdc946212f7cd592986b2c519b470404caa6b8.tar.gz |
NVMe: Simplify queue lookup
Fill in all the num_possible_cpus() entries with duplicate pointers.
This reduces the complexity of the frequently-called get_nvmeq(), as
well as avoiding a bug in it when there are fewer queues than CPUs.
Reported-by: Shane Michael Matthews <shane.matthews@intel.com>
Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/nvme.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/drivers/block/nvme.c b/drivers/block/nvme.c index 8d3c0b7..f94f173 100644 --- a/drivers/block/nvme.c +++ b/drivers/block/nvme.c @@ -221,12 +221,7 @@ static void cancel_cmdid_data(struct nvme_queue *nvmeq, int cmdid) static struct nvme_queue *get_nvmeq(struct nvme_ns *ns) { - int qid, cpu = get_cpu(); - if (cpu < ns->dev->queue_count) - qid = cpu + 1; - else - qid = (cpu % rounddown_pow_of_two(ns->dev->queue_count)) + 1; - return ns->dev->queues[qid]; + return ns->dev->queues[get_cpu() + 1]; } static void put_nvmeq(struct nvme_queue *nvmeq) @@ -1316,6 +1311,11 @@ static int __devinit nvme_setup_io_queues(struct nvme_dev *dev) dev->queue_count++; } + for (; i < num_possible_cpus(); i++) { + int target = i % rounddown_pow_of_two(dev->queue_count - 1); + dev->queues[i + 1] = dev->queues[target + 1]; + } + return 0; } |