Re: [PATCH V4 2/4] vDPA/ifcvf: implement device MSIX vector allocator
From: Jason Wang <jasowang@redhat.com>
Date: 2022-02-14 06:26:16
Also in:
virtualization
在 2022/2/3 下午3:27, Zhu Lingshan 写道:
quoted hunk ↗ jump to hunk
This commit implements a MSIX vector allocation helper for vqs and config interrupts. Signed-off-by: Zhu Lingshan <redacted> --- drivers/vdpa/ifcvf/ifcvf_main.c | 35 +++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-)diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c b/drivers/vdpa/ifcvf/ifcvf_main.c index d1a6b5ab543c..44c89ab0b6da 100644 --- a/drivers/vdpa/ifcvf/ifcvf_main.c +++ b/drivers/vdpa/ifcvf/ifcvf_main.c@@ -58,14 +58,45 @@ static void ifcvf_free_irq(struct ifcvf_adapter *adapter, int queues) ifcvf_free_irq_vectors(pdev); } +/* 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 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); + + 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, i, ret, irq; + int vector, nvectors, i, ret, irq; u16 max_intr; - /* all queues and config interrupt */ + nvectors = ifcvf_alloc_vectors(adapter); + if (!(nvectors > 0)) + return nvectors;
Why not simply checking by using nvectors <= 0? If ifcvf_alloc_vectors can return 0 this breaks the ifcvf_request_irq() caller's assumption.
+ max_intr = vf->nr_vring + 1; ret = pci_alloc_irq_vectors(pdev, max_intr,
So irq is allocated twice here? Thanks