Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -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);
+1 −0
Original line number Diff line number Diff line
@@ -92,6 +92,7 @@ struct nvme_dev {
	struct kref kref;
	struct miscdevice miscdev;
	struct work_struct reset_work;
	struct notifier_block nb;
	char name[12];
	char serial[20];
	char model[40];