Commit ad5c5690 authored by Zhu Lingshan's avatar Zhu Lingshan Committed by Michael S. Tsirkin

vDPA/ifcvf: implement device MSIX vector allocator

This commit implements a MSIX vector allocation helper
for vqs and config interrupts.
Signed-off-by: default avatarZhu Lingshan <lingshan.zhu@intel.com>
Link: https://lore.kernel.org/r/20220222115428.998334-4-lingshan.zhu@intel.comSigned-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent cce0ab2b
...@@ -58,23 +58,44 @@ static void ifcvf_free_irq(struct ifcvf_adapter *adapter, int queues) ...@@ -58,23 +58,44 @@ static void ifcvf_free_irq(struct ifcvf_adapter *adapter, int queues)
ifcvf_free_irq_vectors(pdev); 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 pci_dev *pdev = adapter->pdev;
struct ifcvf_hw *vf = &adapter->vf; struct ifcvf_hw *vf = &adapter->vf;
int vector, i, ret, irq; int max_intr, ret;
u16 max_intr;
/* all queues and config interrupt */ /* all queues and config interrupt */
max_intr = vf->nr_vring + 1; 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) { if (ret < 0) {
IFCVF_ERR(pdev, "Failed to alloc IRQ vectors\n"); IFCVF_ERR(pdev, "Failed to alloc IRQ vectors\n");
return ret; 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", snprintf(vf->config_msix_name, 256, "ifcvf[%s]-config\n",
pci_name(pdev)); pci_name(pdev));
vector = 0; vector = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment