nvme-pci: allocate separate interrupt for the reserved non-polled I/O queue
One queue will be reserved for non-polled IO when nvme.poll_queues is greater or equal than the number of IO queues that the nvme controller can provide. Currently the reserved queue for non-polled IO will reuse the interrupt used by admin queue in this case, e.g, vector 0. This can work and the performance may not be an issue since the admin queue is used unfrequently. However this behaviour may be inconsistent with that when nvme.poll_queues is smaller than the number of IO queues available. Thus allocate separate interrupt for this reserved queue, and thus make the behaviour consistent. Signed-off-by: Jeffle Xu <jefflexu@linux.alibaba.com> [hch: minor cleanups, mostly to the pre-existing surrounding code] Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
936fab503f
commit
21cc2f3f79
|
@ -2038,32 +2038,30 @@ static int nvme_setup_irqs(struct nvme_dev *dev, unsigned int nr_io_queues)
|
|||
.calc_sets = nvme_calc_irq_sets,
|
||||
.priv = dev,
|
||||
};
|
||||
unsigned int irq_queues, this_p_queues;
|
||||
unsigned int irq_queues, poll_queues;
|
||||
|
||||
/*
|
||||
* Poll queues don't need interrupts, but we need at least one IO
|
||||
* queue left over for non-polled IO.
|
||||
* Poll queues don't need interrupts, but we need at least one I/O queue
|
||||
* left over for non-polled I/O.
|
||||
*/
|
||||
this_p_queues = dev->nr_poll_queues;
|
||||
if (this_p_queues >= nr_io_queues) {
|
||||
this_p_queues = nr_io_queues - 1;
|
||||
irq_queues = 1;
|
||||
} else {
|
||||
irq_queues = nr_io_queues - this_p_queues + 1;
|
||||
}
|
||||
dev->io_queues[HCTX_TYPE_POLL] = this_p_queues;
|
||||
poll_queues = min(dev->nr_poll_queues, nr_io_queues - 1);
|
||||
dev->io_queues[HCTX_TYPE_POLL] = poll_queues;
|
||||
|
||||
/* Initialize for the single interrupt case */
|
||||
/*
|
||||
* Initialize for the single interrupt case, will be updated in
|
||||
* nvme_calc_irq_sets().
|
||||
*/
|
||||
dev->io_queues[HCTX_TYPE_DEFAULT] = 1;
|
||||
dev->io_queues[HCTX_TYPE_READ] = 0;
|
||||
|
||||
/*
|
||||
* Some Apple controllers require all queues to use the
|
||||
* first vector.
|
||||
* We need interrupts for the admin queue and each non-polled I/O queue,
|
||||
* but some Apple controllers require all queues to use the first
|
||||
* vector.
|
||||
*/
|
||||
if (dev->ctrl.quirks & NVME_QUIRK_SINGLE_VECTOR)
|
||||
irq_queues = 1;
|
||||
|
||||
irq_queues = 1;
|
||||
if (!(dev->ctrl.quirks & NVME_QUIRK_SINGLE_VECTOR))
|
||||
irq_queues += (nr_io_queues - poll_queues);
|
||||
return pci_alloc_irq_vectors_affinity(pdev, 1, irq_queues,
|
||||
PCI_IRQ_ALL_TYPES | PCI_IRQ_AFFINITY, &affd);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user