diff options
Diffstat (limited to 'drivers/nvme/host/pci.c')
| -rw-r--r-- | drivers/nvme/host/pci.c | 23 | 
1 files changed, 9 insertions, 14 deletions
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index dcaad5831cee..365a2ddbeaa7 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -68,14 +68,14 @@ static int io_queue_depth = 1024;  module_param_cb(io_queue_depth, &io_queue_depth_ops, &io_queue_depth, 0644);  MODULE_PARM_DESC(io_queue_depth, "set io queue depth, should >= 2"); -static int write_queues; -module_param(write_queues, int, 0644); +static unsigned int write_queues; +module_param(write_queues, uint, 0644);  MODULE_PARM_DESC(write_queues,  	"Number of queues to use for writes. If not set, reads and writes "  	"will share a queue set."); -static int poll_queues; -module_param(poll_queues, int, 0644); +static unsigned int poll_queues; +module_param(poll_queues, uint, 0644);  MODULE_PARM_DESC(poll_queues, "Number of queues to use for polled IO.");  struct nvme_dev; @@ -176,7 +176,6 @@ struct nvme_queue {  	u16 sq_tail;  	u16 last_sq_tail;  	u16 cq_head; -	u16 last_cq_head;  	u16 qid;  	u8 cq_phase;  	u8 sqes; @@ -1026,10 +1025,7 @@ static irqreturn_t nvme_irq(int irq, void *data)  	 * the irq handler, even if that was on another CPU.  	 */  	rmb(); -	if (nvmeq->cq_head != nvmeq->last_cq_head) -		ret = IRQ_HANDLED;  	nvme_process_cq(nvmeq, &start, &end, -1); -	nvmeq->last_cq_head = nvmeq->cq_head;  	wmb();  	if (start != end) { @@ -1549,7 +1545,7 @@ static int nvme_create_queue(struct nvme_queue *nvmeq, int qid, bool polled)  	result = adapter_alloc_sq(dev, qid, nvmeq);  	if (result < 0)  		return result; -	else if (result) +	if (result)  		goto release_cq;  	nvmeq->cq_vector = vector; @@ -2058,7 +2054,6 @@ static int nvme_setup_irqs(struct nvme_dev *dev, unsigned int nr_io_queues)  		.priv		= dev,  	};  	unsigned int irq_queues, this_p_queues; -	unsigned int nr_cpus = num_possible_cpus();  	/*  	 * Poll queues don't need interrupts, but we need at least one IO @@ -2069,10 +2064,7 @@ static int nvme_setup_irqs(struct nvme_dev *dev, unsigned int nr_io_queues)  		this_p_queues = nr_io_queues - 1;  		irq_queues = 1;  	} else { -		if (nr_cpus < nr_io_queues - this_p_queues) -			irq_queues = nr_cpus + 1; -		else -			irq_queues = nr_io_queues - this_p_queues + 1; +		irq_queues = nr_io_queues - this_p_queues + 1;  	}  	dev->io_queues[HCTX_TYPE_POLL] = this_p_queues; @@ -3142,6 +3134,9 @@ static int __init nvme_init(void)  	BUILD_BUG_ON(sizeof(struct nvme_create_sq) != 64);  	BUILD_BUG_ON(sizeof(struct nvme_delete_queue) != 64);  	BUILD_BUG_ON(IRQ_AFFINITY_MAX_SETS < 2); + +	write_queues = min(write_queues, num_possible_cpus()); +	poll_queues = min(poll_queues, num_possible_cpus());  	return pci_register_driver(&nvme_driver);  }  | 
