Re: [PATCH v5 1/4] PCI: Introduce pcim_alloc_irq_vectors()
From: Dejin Zheng <hidden>
Date: 2021-05-05 16:27:33
Also in:
linux-i2c, linux-pci, lkml
On Tue, Mar 23, 2021 at 05:47:10PM -0500, Bjorn Helgaas wrote:
[+cc Christoph, Thomas, Alexander, in case you're interested] [+cc Jonathan, Kurt, Logan: vmd.c and switchtec.c use managed resources and pci_alloc_irq_vectors()] On Fri, Feb 26, 2021 at 11:50:53PM +0800, Dejin Zheng wrote:quoted
Introduce pcim_alloc_irq_vectors(), a device-managed version of pci_alloc_irq_vectors(). Introducing this function can simplify the error handling path in many drivers. And use pci_free_irq_vectors() to replace some code in pcim_release(), they are equivalent, and no functional change. It is more explicit that pcim_alloc_irq_vectors() is a device-managed function. Suggested-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Signed-off-by: Dejin Zheng <redacted>Acked-by: Bjorn Helgaas <bhelgaas@google.com> Let me know if you'd like me to take the series.
Hi Bjorn, These patches are still invisible on the mainline, could you help me to take it? Thanks very much! BR, Dejin
quoted
--- v4 -> v5: - Remove the check of enable device in pcim_alloc_irq_vectors() and make it as a static line function. v3 -> v4: - No change v2 -> v3: - Add some commit comments for replace some codes in pcim_release() by pci_free_irq_vectors(). v1 -> v2: - Use pci_free_irq_vectors() to replace some code in pcim_release(). - Modify some commit messages. drivers/pci/pci.c | 5 +---- include/linux/pci.h | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-)diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 16a17215f633..fecfdc0add2f 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c@@ -1969,10 +1969,7 @@ static void pcim_release(struct device *gendev, void *res) struct pci_devres *this = res; int i; - if (dev->msi_enabled) - pci_disable_msi(dev); - if (dev->msix_enabled) - pci_disable_msix(dev); + pci_free_irq_vectors(dev); for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) if (this->region_mask & (1 << i))diff --git a/include/linux/pci.h b/include/linux/pci.h index 86c799c97b77..5cafd7d65fd7 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h@@ -1818,6 +1818,30 @@ pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs, NULL); } +/** + * pcim_alloc_irq_vectors - a device-managed pci_alloc_irq_vectors() + * @dev: PCI device to operate on + * @min_vecs: minimum number of vectors required (must be >= 1) + * @max_vecs: maximum (desired) number of vectors + * @flags: flags or quirks for the allocation + * + * Return the number of vectors allocated, (which might be smaller than + * @max_vecs) if successful, or a negative error code on error. If less + * than @min_vecs interrupt vectors are available for @dev the function + * will fail with -ENOSPC. + * + * It depends on calling pcim_enable_device() to make IRQ resources + * manageable. + */ +static inline int +pcim_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs, + unsigned int max_vecs, unsigned int flags) +{ + if (!pci_is_managed(dev)) + return -EINVAL; + return pci_alloc_irq_vectors(dev, min_vecs, max_vecs, flags); +} + /* Include architecture-dependent settings and functions */ #include <asm/pci.h>-- 2.25.0