diff options
author | Keith Busch <keith.busch@intel.com> | 2014-03-24 20:46:26 +0400 |
---|---|---|
committer | Matthew Wilcox <matthew.r.wilcox@intel.com> | 2014-04-11 01:03:42 +0400 |
commit | 33b1e95c90447ea73e37e837ea0268a894919f19 (patch) | |
tree | 63e28b93a0524b69c29595c8648008dcc145b3b9 /drivers/block | |
parent | 42f614201e80ff4cfb8b285d7190149a8e1e6cec (diff) | |
download | linux-33b1e95c90447ea73e37e837ea0268a894919f19.tar.xz |
NVMe: CPU hot plug notification
Registers with hot cpu notification to rebalance, and potentially allocate
additional, io queues.
Signed-off-by: Keith Busch <keith.busch@intel.com>
Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/nvme-core.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c index 48d7bd55207a..ce5a4f1a3950 100644 --- a/drivers/block/nvme-core.c +++ b/drivers/block/nvme-core.c @@ -2002,6 +2002,19 @@ static size_t db_bar_size(struct nvme_dev *dev, unsigned nr_io_queues) return 4096 + ((nr_io_queues + 1) * 8 * dev->db_stride); } +static int nvme_cpu_notify(struct notifier_block *self, + unsigned long action, void *hcpu) +{ + struct nvme_dev *dev = container_of(self, struct nvme_dev, nb); + switch (action) { + case CPU_ONLINE: + case CPU_DEAD: + nvme_assign_io_queues(dev); + break; + } + return NOTIFY_OK; +} + static int nvme_setup_io_queues(struct nvme_dev *dev) { struct nvme_queue *adminq = raw_nvmeq(dev, 0); @@ -2080,6 +2093,11 @@ static int nvme_setup_io_queues(struct nvme_dev *dev) nvme_free_queues(dev, nr_io_queues + 1); nvme_assign_io_queues(dev); + dev->nb.notifier_call = &nvme_cpu_notify; + result = register_hotcpu_notifier(&dev->nb); + if (result) + goto free_queues; + return 0; free_queues: @@ -2357,6 +2375,7 @@ static void nvme_dev_shutdown(struct nvme_dev *dev) int i; dev->initialized = 0; + unregister_hotcpu_notifier(&dev->nb); spin_lock(&dev_list_lock); list_del_init(&dev->node); |