diff mbox series

[v6,1/4] PCI: Introduce pcim_alloc_irq_vectors()

Message ID 20210606070511.778487-2-zhengdejin5@gmail.com
State Superseded
Headers show
Series Introduce pcim_alloc_irq_vectors() | expand

Commit Message

Dejin Zheng June 6, 2021, 7:05 a.m. UTC
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>
Reviewed-by: Robert Richter <rric@kernel.org>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Dejin Zheng <zhengdejin5@gmail.com>
---
v5 -> v6:
	- rebase to 5.13-rc4
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(-)

Comments

kernel test robot June 6, 2021, 7:31 p.m. UTC | #1
Hi Dejin,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on pci/next]
[also build test ERROR on wsa/i2c/for-next lwn/docs-next linus/master v5.13-rc4 next-20210604]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Dejin-Zheng/Introduce-pcim_alloc_irq_vectors/20210606-150730
base:   https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git next
config: sparc-randconfig-c004-20210606 (attached as .config)
compiler: sparc64-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/7b311110dce8729956f7545d1f11b2bbd60f6193
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Dejin-Zheng/Introduce-pcim_alloc_irq_vectors/20210606-150730
        git checkout 7b311110dce8729956f7545d1f11b2bbd60f6193
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=sparc 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   In file included from net/core/rtnetlink.c:37:
   include/linux/pci.h: In function 'pcim_alloc_irq_vectors':
>> include/linux/pci.h:1847:7: error: implicit declaration of function 'pci_is_managed' [-Werror=implicit-function-declaration]
    1847 |  if (!pci_is_managed(dev))
         |       ^~~~~~~~~~~~~~
   cc1: some warnings being treated as errors
--
   In file included from arch/sparc/lib/iomap.c:5:
   include/linux/pci.h: In function 'pcim_alloc_irq_vectors':
>> include/linux/pci.h:1847:7: error: implicit declaration of function 'pci_is_managed' [-Werror=implicit-function-declaration]
    1847 |  if (!pci_is_managed(dev))
         |       ^~~~~~~~~~~~~~
   cc1: all warnings being treated as errors
--
   In file included from drivers/gpu/drm/drm_file.c:38:
   include/linux/pci.h: In function 'pcim_alloc_irq_vectors':
>> include/linux/pci.h:1847:7: error: implicit declaration of function 'pci_is_managed' [-Werror=implicit-function-declaration]
    1847 |  if (!pci_is_managed(dev))
         |       ^~~~~~~~~~~~~~
   drivers/gpu/drm/drm_file.c: At top level:
   drivers/gpu/drm/drm_file.c:789:6: warning: no previous prototype for 'drm_send_event_helper' [-Wmissing-prototypes]
     789 | void drm_send_event_helper(struct drm_device *dev,
         |      ^~~~~~~~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors
--
   In file included from drivers/ide/ide-proc.c:25:
   include/linux/pci.h: In function 'pcim_alloc_irq_vectors':
>> include/linux/pci.h:1847:7: error: implicit declaration of function 'pci_is_managed' [-Werror=implicit-function-declaration]
    1847 |  if (!pci_is_managed(dev))
         |       ^~~~~~~~~~~~~~
   At top level:
   drivers/ide/ide-proc.c:457:37: warning: 'ide_media_proc_fops' defined but not used [-Wunused-const-variable=]
     457 | static const struct file_operations ide_media_proc_fops = {
         |                                     ^~~~~~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors
--
   In file included from include/linux/ide.h:18,
                    from drivers/ide/ide-cd_ioctl.c:13:
   include/linux/pci.h: In function 'pcim_alloc_irq_vectors':
>> include/linux/pci.h:1847:7: error: implicit declaration of function 'pci_is_managed' [-Werror=implicit-function-declaration]
    1847 |  if (!pci_is_managed(dev))
         |       ^~~~~~~~~~~~~~
   drivers/ide/ide-cd_ioctl.c: In function 'ide_cdrom_select_speed':
   drivers/ide/ide-cd_ioctl.c:212:6: warning: variable 'stat' set but not used [-Wunused-but-set-variable]
     212 |  int stat;
         |      ^~~~
   cc1: some warnings being treated as errors
--
   In file included from drivers/ata/ahci.h:22,
                    from drivers/ata/ahci_platform.c:21:
   include/linux/pci.h: In function 'pcim_alloc_irq_vectors':
>> include/linux/pci.h:1847:7: error: implicit declaration of function 'pci_is_managed' [-Werror=implicit-function-declaration]
    1847 |  if (!pci_is_managed(dev))
         |       ^~~~~~~~~~~~~~
   In file included from drivers/ata/ahci_platform.c:21:
   drivers/ata/ahci_platform.c: At top level:
   drivers/ata/ahci.h:388:16: warning: initialized field overwritten [-Woverride-init]
     388 |  .can_queue  = AHCI_MAX_CMDS,   \
         |                ^~~~~~~~~~~~~
   drivers/ata/ahci_platform.c:40:2: note: in expansion of macro 'AHCI_SHT'
      40 |  AHCI_SHT(DRV_NAME),
         |  ^~~~~~~~
   drivers/ata/ahci.h:388:16: note: (near initialization for 'ahci_platform_sht.can_queue')
     388 |  .can_queue  = AHCI_MAX_CMDS,   \
         |                ^~~~~~~~~~~~~
   drivers/ata/ahci_platform.c:40:2: note: in expansion of macro 'AHCI_SHT'
      40 |  AHCI_SHT(DRV_NAME),
         |  ^~~~~~~~
   drivers/ata/ahci.h:392:17: warning: initialized field overwritten [-Woverride-init]
     392 |  .sdev_attrs  = ahci_sdev_attrs
         |                 ^~~~~~~~~~~~~~~
   drivers/ata/ahci_platform.c:40:2: note: in expansion of macro 'AHCI_SHT'
      40 |  AHCI_SHT(DRV_NAME),
         |  ^~~~~~~~
   drivers/ata/ahci.h:392:17: note: (near initialization for 'ahci_platform_sht.sdev_attrs')
     392 |  .sdev_attrs  = ahci_sdev_attrs
         |                 ^~~~~~~~~~~~~~~
   drivers/ata/ahci_platform.c:40:2: note: in expansion of macro 'AHCI_SHT'
      40 |  AHCI_SHT(DRV_NAME),
         |  ^~~~~~~~
   cc1: some warnings being treated as errors
--
   In file included from drivers/usb/host/xhci.c:11:
   include/linux/pci.h: In function 'pcim_alloc_irq_vectors':
>> include/linux/pci.h:1847:7: error: implicit declaration of function 'pci_is_managed' [-Werror=implicit-function-declaration]
    1847 |  if (!pci_is_managed(dev))
         |       ^~~~~~~~~~~~~~
   drivers/usb/host/xhci.c: In function 'xhci_unmap_temp_buf':
   drivers/usb/host/xhci.c:1349:15: warning: variable 'len' set but not used [-Wunused-but-set-variable]
    1349 |  unsigned int len;
         |               ^~~
   cc1: some warnings being treated as errors

Kconfig warnings: (for reference only)
   WARNING: unmet direct dependencies detected for LOCKDEP
   Depends on DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT && (FRAME_POINTER || MIPS || PPC || S390 || MICROBLAZE || ARM || ARC || X86)
   Selected by
   - PROVE_LOCKING && DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT
   - DEBUG_LOCK_ALLOC && DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT


vim +/pci_is_managed +1847 include/linux/pci.h

  1827	
  1828	/**
  1829	 * pcim_alloc_irq_vectors - a device-managed pci_alloc_irq_vectors()
  1830	 * @dev:		PCI device to operate on
  1831	 * @min_vecs:		minimum number of vectors required (must be >= 1)
  1832	 * @max_vecs:		maximum (desired) number of vectors
  1833	 * @flags:		flags or quirks for the allocation
  1834	 *
  1835	 * Return the number of vectors allocated, (which might be smaller than
  1836	 * @max_vecs) if successful, or a negative error code on error. If less
  1837	 * than @min_vecs interrupt vectors are available for @dev the function
  1838	 * will fail with -ENOSPC.
  1839	 *
  1840	 * It depends on calling pcim_enable_device() to make IRQ resources
  1841	 * manageable.
  1842	 */
  1843	static inline int
  1844	pcim_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
  1845				unsigned int max_vecs, unsigned int flags)
  1846	{
> 1847		if (!pci_is_managed(dev))
  1848			return -EINVAL;
  1849		return pci_alloc_irq_vectors(dev, min_vecs, max_vecs, flags);
  1850	}
  1851	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Dejin Zheng June 7, 2021, 2:24 p.m. UTC | #2
On Mon, Jun 07, 2021 at 03:31:04AM +0800, kernel test robot wrote:
> Hi Dejin,
> 
> Thank you for the patch! Yet something to improve:
> 
> [auto build test ERROR on pci/next]
> [also build test ERROR on wsa/i2c/for-next lwn/docs-next linus/master v5.13-rc4 next-20210604]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch]
> 
> url:    https://github.com/0day-ci/linux/commits/Dejin-Zheng/Introduce-pcim_alloc_irq_vectors/20210606-150730
> base:   https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git next
> config: sparc-randconfig-c004-20210606 (attached as .config)
> compiler: sparc64-linux-gcc (GCC) 9.3.0
> reproduce (this is a W=1 build):
>         wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
>         chmod +x ~/bin/make.cross
>         # https://github.com/0day-ci/linux/commit/7b311110dce8729956f7545d1f11b2bbd60f6193
>         git remote add linux-review https://github.com/0day-ci/linux
>         git fetch --no-tags linux-review Dejin-Zheng/Introduce-pcim_alloc_irq_vectors/20210606-150730
>         git checkout 7b311110dce8729956f7545d1f11b2bbd60f6193
>         # save the attached .config to linux build tree
>         COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=sparc 
> 
> If you fix the issue, kindly add following tag as appropriate
> Reported-by: kernel test robot <lkp@intel.com>
> 
> All errors (new ones prefixed by >>):
> 
>    In file included from net/core/rtnetlink.c:37:
>    include/linux/pci.h: In function 'pcim_alloc_irq_vectors':
> >> include/linux/pci.h:1847:7: error: implicit declaration of function 'pci_is_managed' [-Werror=implicit-function-declaration]
>     1847 |  if (!pci_is_managed(dev))
>          |       ^~~~~~~~~~~~~~
>    cc1: some warnings being treated as errors
> --

Thanks very much for Kernel test robot, I got the root cause of this build error.
I will send a new patch version for fix it.

The sparc defconfig disable PCI, so it can not found the CONFIG_PCI in pci.h,
and the pci_is_managed() function only exists in the pci.h when enable PCI.
so it will report builld this error when disable PCI.

BR,
Dejin
>    In file included from arch/sparc/lib/iomap.c:5:
>    include/linux/pci.h: In function 'pcim_alloc_irq_vectors':
> >> include/linux/pci.h:1847:7: error: implicit declaration of function 'pci_is_managed' [-Werror=implicit-function-declaration]
>     1847 |  if (!pci_is_managed(dev))
>          |       ^~~~~~~~~~~~~~
>    cc1: all warnings being treated as errors
> --
>    In file included from drivers/gpu/drm/drm_file.c:38:
>    include/linux/pci.h: In function 'pcim_alloc_irq_vectors':
> >> include/linux/pci.h:1847:7: error: implicit declaration of function 'pci_is_managed' [-Werror=implicit-function-declaration]
>     1847 |  if (!pci_is_managed(dev))
>          |       ^~~~~~~~~~~~~~
>    drivers/gpu/drm/drm_file.c: At top level:
>    drivers/gpu/drm/drm_file.c:789:6: warning: no previous prototype for 'drm_send_event_helper' [-Wmissing-prototypes]
>      789 | void drm_send_event_helper(struct drm_device *dev,
>          |      ^~~~~~~~~~~~~~~~~~~~~
>    cc1: some warnings being treated as errors
> --
>    In file included from drivers/ide/ide-proc.c:25:
>    include/linux/pci.h: In function 'pcim_alloc_irq_vectors':
> >> include/linux/pci.h:1847:7: error: implicit declaration of function 'pci_is_managed' [-Werror=implicit-function-declaration]
>     1847 |  if (!pci_is_managed(dev))
>          |       ^~~~~~~~~~~~~~
>    At top level:
>    drivers/ide/ide-proc.c:457:37: warning: 'ide_media_proc_fops' defined but not used [-Wunused-const-variable=]
>      457 | static const struct file_operations ide_media_proc_fops = {
>          |                                     ^~~~~~~~~~~~~~~~~~~
>    cc1: some warnings being treated as errors
> --
>    In file included from include/linux/ide.h:18,
>                     from drivers/ide/ide-cd_ioctl.c:13:
>    include/linux/pci.h: In function 'pcim_alloc_irq_vectors':
> >> include/linux/pci.h:1847:7: error: implicit declaration of function 'pci_is_managed' [-Werror=implicit-function-declaration]
>     1847 |  if (!pci_is_managed(dev))
>          |       ^~~~~~~~~~~~~~
>    drivers/ide/ide-cd_ioctl.c: In function 'ide_cdrom_select_speed':
>    drivers/ide/ide-cd_ioctl.c:212:6: warning: variable 'stat' set but not used [-Wunused-but-set-variable]
>      212 |  int stat;
>          |      ^~~~
>    cc1: some warnings being treated as errors
> --
>    In file included from drivers/ata/ahci.h:22,
>                     from drivers/ata/ahci_platform.c:21:
>    include/linux/pci.h: In function 'pcim_alloc_irq_vectors':
> >> include/linux/pci.h:1847:7: error: implicit declaration of function 'pci_is_managed' [-Werror=implicit-function-declaration]
>     1847 |  if (!pci_is_managed(dev))
>          |       ^~~~~~~~~~~~~~
>    In file included from drivers/ata/ahci_platform.c:21:
>    drivers/ata/ahci_platform.c: At top level:
>    drivers/ata/ahci.h:388:16: warning: initialized field overwritten [-Woverride-init]
>      388 |  .can_queue  = AHCI_MAX_CMDS,   \
>          |                ^~~~~~~~~~~~~
>    drivers/ata/ahci_platform.c:40:2: note: in expansion of macro 'AHCI_SHT'
>       40 |  AHCI_SHT(DRV_NAME),
>          |  ^~~~~~~~
>    drivers/ata/ahci.h:388:16: note: (near initialization for 'ahci_platform_sht.can_queue')
>      388 |  .can_queue  = AHCI_MAX_CMDS,   \
>          |                ^~~~~~~~~~~~~
>    drivers/ata/ahci_platform.c:40:2: note: in expansion of macro 'AHCI_SHT'
>       40 |  AHCI_SHT(DRV_NAME),
>          |  ^~~~~~~~
>    drivers/ata/ahci.h:392:17: warning: initialized field overwritten [-Woverride-init]
>      392 |  .sdev_attrs  = ahci_sdev_attrs
>          |                 ^~~~~~~~~~~~~~~
>    drivers/ata/ahci_platform.c:40:2: note: in expansion of macro 'AHCI_SHT'
>       40 |  AHCI_SHT(DRV_NAME),
>          |  ^~~~~~~~
>    drivers/ata/ahci.h:392:17: note: (near initialization for 'ahci_platform_sht.sdev_attrs')
>      392 |  .sdev_attrs  = ahci_sdev_attrs
>          |                 ^~~~~~~~~~~~~~~
>    drivers/ata/ahci_platform.c:40:2: note: in expansion of macro 'AHCI_SHT'
>       40 |  AHCI_SHT(DRV_NAME),
>          |  ^~~~~~~~
>    cc1: some warnings being treated as errors
> --
>    In file included from drivers/usb/host/xhci.c:11:
>    include/linux/pci.h: In function 'pcim_alloc_irq_vectors':
> >> include/linux/pci.h:1847:7: error: implicit declaration of function 'pci_is_managed' [-Werror=implicit-function-declaration]
>     1847 |  if (!pci_is_managed(dev))
>          |       ^~~~~~~~~~~~~~
>    drivers/usb/host/xhci.c: In function 'xhci_unmap_temp_buf':
>    drivers/usb/host/xhci.c:1349:15: warning: variable 'len' set but not used [-Wunused-but-set-variable]
>     1349 |  unsigned int len;
>          |               ^~~
>    cc1: some warnings being treated as errors
> 
> Kconfig warnings: (for reference only)
>    WARNING: unmet direct dependencies detected for LOCKDEP
>    Depends on DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT && (FRAME_POINTER || MIPS || PPC || S390 || MICROBLAZE || ARM || ARC || X86)
>    Selected by
>    - PROVE_LOCKING && DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT
>    - DEBUG_LOCK_ALLOC && DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT
> 
> 
> vim +/pci_is_managed +1847 include/linux/pci.h
> 
>   1827	
>   1828	/**
>   1829	 * pcim_alloc_irq_vectors - a device-managed pci_alloc_irq_vectors()
>   1830	 * @dev:		PCI device to operate on
>   1831	 * @min_vecs:		minimum number of vectors required (must be >= 1)
>   1832	 * @max_vecs:		maximum (desired) number of vectors
>   1833	 * @flags:		flags or quirks for the allocation
>   1834	 *
>   1835	 * Return the number of vectors allocated, (which might be smaller than
>   1836	 * @max_vecs) if successful, or a negative error code on error. If less
>   1837	 * than @min_vecs interrupt vectors are available for @dev the function
>   1838	 * will fail with -ENOSPC.
>   1839	 *
>   1840	 * It depends on calling pcim_enable_device() to make IRQ resources
>   1841	 * manageable.
>   1842	 */
>   1843	static inline int
>   1844	pcim_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
>   1845				unsigned int max_vecs, unsigned int flags)
>   1846	{
> > 1847		if (!pci_is_managed(dev))
>   1848			return -EINVAL;
>   1849		return pci_alloc_irq_vectors(dev, min_vecs, max_vecs, flags);
>   1850	}
>   1851	
> 
> ---
> 0-DAY CI Kernel Test Service, Intel Corporation
> https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff mbox series

Patch

diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index b717680377a9..6319e5889688 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -1989,10 +1989,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 c20211e59a57..e9c95cab2540 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1825,6 +1825,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>