Re: [PATCH V4 2/4] vDPA/ifcvf: implement device MSIX vector allocator
From: Zhu, Lingshan <hidden>
Date: 2022-02-14 06:46:42
On 2/14/2022 2:26 PM, Jason Wang wrote:
在 2022/2/3 下午3:27, Zhu Lingshan 写道:quoted
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.cb/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.
It can return zero if no vectors allocated, then ifcvf_request_irq fails. For sure I can use <=0 Thanks!
quoted
+ max_intr = vf->nr_vring + 1; ret = pci_alloc_irq_vectors(pdev, max_intr,So irq is allocated twice here?
Oh, it is a rebasing problem, I should move the deleting line here from the next patch. Thanks
Thanks