|
@@ -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);
|