Commit 33b1e95c authored by Keith Busch's avatar Keith Busch Committed by Matthew Wilcox

NVMe: CPU hot plug notification

Registers with hot cpu notification to rebalance, and potentially allocate
additional, io queues.
Signed-off-by: default avatarKeith Busch <keith.busch@intel.com>
Signed-off-by: default avatarMatthew Wilcox <matthew.r.wilcox@intel.com>
parent 42f61420
...@@ -2002,6 +2002,19 @@ static size_t db_bar_size(struct nvme_dev *dev, unsigned nr_io_queues) ...@@ -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); 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) static int nvme_setup_io_queues(struct nvme_dev *dev)
{ {
struct nvme_queue *adminq = raw_nvmeq(dev, 0); struct nvme_queue *adminq = raw_nvmeq(dev, 0);
...@@ -2080,6 +2093,11 @@ static int nvme_setup_io_queues(struct nvme_dev *dev) ...@@ -2080,6 +2093,11 @@ static int nvme_setup_io_queues(struct nvme_dev *dev)
nvme_free_queues(dev, nr_io_queues + 1); nvme_free_queues(dev, nr_io_queues + 1);
nvme_assign_io_queues(dev); 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; return 0;
free_queues: free_queues:
...@@ -2357,6 +2375,7 @@ static void nvme_dev_shutdown(struct nvme_dev *dev) ...@@ -2357,6 +2375,7 @@ static void nvme_dev_shutdown(struct nvme_dev *dev)
int i; int i;
dev->initialized = 0; dev->initialized = 0;
unregister_hotcpu_notifier(&dev->nb);
spin_lock(&dev_list_lock); spin_lock(&dev_list_lock);
list_del_init(&dev->node); list_del_init(&dev->node);
......
...@@ -92,6 +92,7 @@ struct nvme_dev { ...@@ -92,6 +92,7 @@ struct nvme_dev {
struct kref kref; struct kref kref;
struct miscdevice miscdev; struct miscdevice miscdev;
struct work_struct reset_work; struct work_struct reset_work;
struct notifier_block nb;
char name[12]; char name[12];
char serial[20]; char serial[20];
char model[40]; char model[40];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment