Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751278AbdCZHGk (ORCPT ); Sun, 26 Mar 2017 03:06:40 -0400 Received: from ex13-edg-ou-001.vmware.com ([208.91.0.189]:32289 "EHLO EX13-EDG-OU-001.vmware.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751063AbdCZHGj (ORCPT ); Sun, 26 Mar 2017 03:06:39 -0400 X-Greylist: delayed 901 seconds by postgrey-1.27 at vger.kernel.org; Sun, 26 Mar 2017 03:06:39 EDT Date: Sat, 25 Mar 2017 23:51:12 -0700 From: Petr Vandrovec To: CC: , , , Subject: [PATCH] vmw_vmci: Fix irq allocation Message-ID: <20170326065112.iv65box7muvifxzw@petr-dev3.eng.vmware.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline User-Agent: NeoMutt/20170306 (1.8.0) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2311 Lines: 62 From: Petr Vandrovec Change 3bb434 (vmw_vmci: switch to pci_irq_alloc_vectors) converted vmw_vmci to use pci_irq_alloc_vectors. Unfortunately for the code pci_irq_alloc_vectors returns number of allocated vectors on success, rather than zero. So successful allocation was always treated as an error, causing slew of warning messages, and then error that device probe method returned unexpected value 2. Checking that error is < 0 fixes problem. While I was there, I've simplified allocation to do just one pci_irq_alloc_vectors call: VMCI device currently supports only two MSI-X vectors, so we either get two dedicated vectors, or one shared vector. Nothing else can happen. So we can ask for minimum=1, maximum=2, MSI-X | MSI | Legacy, and get back best possible choice. Signed-off-by: Petr Vandrovec Cc: Christoph Hellwig Cc: Greg Kroah-Hartman Fixes: 3bb434cdcc6a ("vmw_vmci: switch to pci_irq_alloc_vectors") --- drivers/misc/vmw_vmci/vmci_guest.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/drivers/misc/vmw_vmci/vmci_guest.c b/drivers/misc/vmw_vmci/vmci_guest.c index 9d659542a335..6aea073841c8 100644 --- a/drivers/misc/vmw_vmci/vmci_guest.c +++ b/drivers/misc/vmw_vmci/vmci_guest.c @@ -464,7 +464,6 @@ static int vmci_guest_probe_device(struct pci_dev *pdev, } vmci_dev->dev = &pdev->dev; - vmci_dev->exclusive_vectors = false; vmci_dev->iobase = iobase; tasklet_init(&vmci_dev->datagram_tasklet, @@ -564,16 +563,11 @@ static int vmci_guest_probe_device(struct pci_dev *pdev, * Enable interrupts. Try MSI-X first, then MSI, and then fallback on * legacy interrupts. */ - error = pci_alloc_irq_vectors(pdev, VMCI_MAX_INTRS, VMCI_MAX_INTRS, - PCI_IRQ_MSIX); - if (error) { - error = pci_alloc_irq_vectors(pdev, 1, 1, - PCI_IRQ_MSIX | PCI_IRQ_MSI | PCI_IRQ_LEGACY); - if (error) - goto err_remove_bitmap; - } else { - vmci_dev->exclusive_vectors = true; - } + error = pci_alloc_irq_vectors(pdev, 1, VMCI_MAX_INTRS, + PCI_IRQ_MSIX | PCI_IRQ_MSI | PCI_IRQ_LEGACY); + if (error < 0) + goto err_remove_bitmap; + vmci_dev->exclusive_vectors = error == VMCI_MAX_INTRS; /* * Request IRQ for legacy or MSI interrupts, or for first -- 2.11.0