vDPA/ifcvf: implement device MSIX vector allocator
This commit implements a MSIX vector allocation helper for vqs and config interrupts. Signed-off-by: Zhu Lingshan <lingshan.zhu@intel.com> Link: https://lore.kernel.org/r/20220222115428.998334-4-lingshan.zhu@intel.com Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
Родитель
cce0ab2b2a
Коммит
ad5c5690de
|
@ -58,23 +58,44 @@ static void ifcvf_free_irq(struct ifcvf_adapter *adapter, int queues)
|
|||
ifcvf_free_irq_vectors(pdev);
|
||||
}
|
||||
|
||||
static int ifcvf_request_irq(struct ifcvf_adapter *adapter)
|
||||
/* ifcvf MSIX vectors allocator, this helper tries to allocate
|
||||
* vectors for all virtqueues and the config interrupt.
|
||||
* It returns the number of allocated vectors, negative
|
||||
* return value when fails.
|
||||
*/
|
||||
static int ifcvf_alloc_vectors(struct ifcvf_adapter *adapter)
|
||||
{
|
||||
struct pci_dev *pdev = adapter->pdev;
|
||||
struct ifcvf_hw *vf = &adapter->vf;
|
||||
int vector, i, ret, irq;
|
||||
u16 max_intr;
|
||||
int max_intr, ret;
|
||||
|
||||
/* all queues and config interrupt */
|
||||
max_intr = vf->nr_vring + 1;
|
||||
ret = pci_alloc_irq_vectors(pdev, 1, max_intr, PCI_IRQ_MSIX | PCI_IRQ_AFFINITY);
|
||||
|
||||
ret = pci_alloc_irq_vectors(pdev, max_intr,
|
||||
max_intr, PCI_IRQ_MSIX);
|
||||
if (ret < 0) {
|
||||
IFCVF_ERR(pdev, "Failed to alloc IRQ vectors\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (ret < max_intr)
|
||||
IFCVF_INFO(pdev,
|
||||
"Requested %u vectors, however only %u allocated, lower performance\n",
|
||||
max_intr, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ifcvf_request_irq(struct ifcvf_adapter *adapter)
|
||||
{
|
||||
struct pci_dev *pdev = adapter->pdev;
|
||||
struct ifcvf_hw *vf = &adapter->vf;
|
||||
int vector, nvectors, i, ret, irq;
|
||||
|
||||
nvectors = ifcvf_alloc_vectors(adapter);
|
||||
if (nvectors <= 0)
|
||||
return -EFAULT;
|
||||
|
||||
snprintf(vf->config_msix_name, 256, "ifcvf[%s]-config\n",
|
||||
pci_name(pdev));
|
||||
vector = 0;
|
||||
|
|
Загрузка…
Ссылка в новой задаче