CC: [email protected] CC: [email protected] In-Reply-To: <[email protected]> References: <[email protected]> TO: Jan Kiszka <[email protected]> TO: "[email protected]" <[email protected]> TO: Bjorn Helgaas <[email protected]> CC: Linux Kernel Mailing List <[email protected]>
Hi Jan, I love your patch! Perhaps something to improve: [auto build test WARNING on pci/next] [also build test WARNING on v5.14-rc6 next-20210820] [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/Jan-Kiszka/PCI-portdrv-Do-not-setup-up-IRQs-if-there-are-no-users/20210820-215311 base: https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git next :::::: branch date: 2 days ago :::::: commit date: 2 days ago config: arm-randconfig-c002-20210822 (attached as .config) compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 9e9d70591e72fc6762b4b9a226b68ed1307419bf) 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 # install arm cross compiling tool for clang build # apt-get install binutils-arm-linux-gnueabi # https://github.com/0day-ci/linux/commit/30b9aea30a820b153bb866daf79d1738628934d8 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Jan-Kiszka/PCI-portdrv-Do-not-setup-up-IRQs-if-there-are-no-users/20210820-215311 git checkout 30b9aea30a820b153bb866daf79d1738628934d8 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=arm clang-analyzer If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <[email protected]> clang-analyzer warnings: (new ones prefixed by >>) ^ include/linux/workqueue.h:272:2: note: expanded from macro 'INIT_DELAYED_WORK' __INIT_DELAYED_WORK(_work, _func, 0) ^ include/linux/workqueue.h:258:3: note: expanded from macro '__INIT_DELAYED_WORK' __init_timer(&(_work)->timer, \ ^ include/linux/timer.h:113:2: note: expanded from macro '__init_timer' do { \ ^ drivers/media/cec/core/cec-adap.c:897:2: note: Loop condition is false. Exiting loop INIT_DELAYED_WORK(&data->work, cec_wait_timeout); ^ include/linux/workqueue.h:272:2: note: expanded from macro 'INIT_DELAYED_WORK' __INIT_DELAYED_WORK(_work, _func, 0) ^ include/linux/workqueue.h:256:2: note: expanded from macro '__INIT_DELAYED_WORK' do { \ ^ drivers/media/cec/core/cec-adap.c:899:6: note: Assuming 'fh' is null if (fh) ^~ drivers/media/cec/core/cec-adap.c:899:2: note: Taking false branch if (fh) ^ drivers/media/cec/core/cec-adap.c:904:6: note: Assuming field 'transmitting' is non-null if (!adap->transmitting) ^~~~~~~~~~~~~~~~~~~ drivers/media/cec/core/cec-adap.c:904:2: note: Taking false branch if (!adap->transmitting) ^ drivers/media/cec/core/cec-adap.c:908:6: note: Assuming 'block' is true if (!block) ^~~~~~ drivers/media/cec/core/cec-adap.c:908:2: note: Taking false branch if (!block) ^ drivers/media/cec/core/cec-adap.c:916:6: note: Assuming field 'completed' is false if (!data->completed) ^~~~~~~~~~~~~~~~ drivers/media/cec/core/cec-adap.c:916:2: note: Taking true branch if (!data->completed) ^ drivers/media/cec/core/cec-adap.c:921:6: note: Assuming field 'completed' is false if (!data->completed) ^~~~~~~~~~~~~~~~ drivers/media/cec/core/cec-adap.c:921:2: note: Taking true branch if (!data->completed) ^ drivers/media/cec/core/cec-adap.c:922:3: note: Calling 'cec_data_cancel' cec_data_cancel(data, CEC_TX_STATUS_ABORTED); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/media/cec/core/cec-adap.c:378:6: note: Assuming 'data' is equal to field 'transmitting' if (data->adap->transmitting == data) { ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/media/cec/core/cec-adap.c:378:2: note: Taking true branch if (data->adap->transmitting == data) { ^ drivers/media/cec/core/cec-adap.c:387:6: note: Assuming the condition is true if (data->msg.tx_status & CEC_TX_STATUS_OK) { ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/media/cec/core/cec-adap.c:387:2: note: Taking true branch if (data->msg.tx_status & CEC_TX_STATUS_OK) { ^ drivers/media/cec/core/cec-adap.c:401:2: note: Calling 'cec_data_completed' cec_data_completed(data); ^~~~~~~~~~~~~~~~~~~~~~~~ drivers/media/cec/core/cec-adap.c:344:6: note: Assuming field 'fh' is null if (data->fh) ^~~~~~~~ drivers/media/cec/core/cec-adap.c:344:2: note: Taking false branch if (data->fh) ^ drivers/media/cec/core/cec-adap.c:347:6: note: Assuming field 'blocking' is false if (data->blocking) { ^~~~~~~~~~~~~~ drivers/media/cec/core/cec-adap.c:347:2: note: Taking false branch if (data->blocking) { ^ drivers/media/cec/core/cec-adap.c:359:13: note: Field 'fh' is null if (data->fh) ^ drivers/media/cec/core/cec-adap.c:359:3: note: Taking false branch if (data->fh) ^ drivers/media/cec/core/cec-adap.c:361:3: note: Memory is released kfree(data); ^~~~~~~~~~~ drivers/media/cec/core/cec-adap.c:401:2: note: Returning; memory was released via 1st parameter cec_data_completed(data); ^~~~~~~~~~~~~~~~~~~~~~~~ drivers/media/cec/core/cec-adap.c:922:3: note: Returning; memory was released via 1st parameter cec_data_cancel(data, CEC_TX_STATUS_ABORTED); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/media/cec/core/cec-adap.c:925:9: note: Use of memory after it is freed *msg = data->msg; ^~~~~~~~~ Suppressed 6 warnings (6 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 7 warnings generated. >> drivers/pci/pcie/portdrv_core.c:364:8: warning: 3rd function call argument >> is an uninitialized value [clang-analyzer-core.CallAndMessage] if (!pcie_device_init(dev, service, irqs[i])) ^ ~~~~~~~ drivers/pci/pcie/portdrv_core.c:320:6: note: Assuming 'status' is 0 if (status) ^~~~~~ drivers/pci/pcie/portdrv_core.c:320:2: note: Taking false branch if (status) ^ drivers/pci/pcie/portdrv_core.c:324:17: note: Calling 'get_port_device_capability' capabilities = get_port_device_capability(dev); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/pci/pcie/portdrv_core.c:211:6: note: Assuming field 'is_hotplug_bridge' is not equal to 0 if (dev->is_hotplug_bridge && ^~~~~~~~~~~~~~~~~~~~~~ drivers/pci/pcie/portdrv_core.c:211:6: note: Left side of '&&' is true drivers/pci/pcie/portdrv_core.c:212:7: note: Assuming 'pcie_ports_native' is true (pcie_ports_native || host->native_pcie_hotplug)) { ^~~~~~~~~~~~~~~~~ drivers/pci/pcie/portdrv_core.c:212:25: note: Left side of '||' is true (pcie_ports_native || host->native_pcie_hotplug)) { ^ drivers/pci/pcie/portdrv_core.c:224:6: note: Assuming field 'aer_cap' is 0 if (dev->aer_cap && pci_aer_available() && ^~~~~~~~~~~~ drivers/pci/pcie/portdrv_core.c:224:19: note: Left side of '&&' is false if (dev->aer_cap && pci_aer_available() && ^ drivers/pci/pcie/portdrv_core.c:237:7: note: Assuming the condition is true if ((pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT || ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/pci/pcie/portdrv_core.c:237:52: note: Left side of '||' is true if ((pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT || ^ drivers/pci/pcie/portdrv_core.c:239:7: note: Assuming 'pcie_ports_native' is false (pcie_ports_native || host->native_pme)) { ^~~~~~~~~~~~~~~~~ drivers/pci/pcie/portdrv_core.c:239:7: note: Left side of '||' is false drivers/pci/pcie/portdrv_core.c:239:28: note: Assuming field 'native_pme' is 0 (pcie_ports_native || host->native_pme)) { ^~~~~~~~~~~~~~~~ drivers/pci/pcie/portdrv_core.c:237:2: note: Taking false branch if ((pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT || ^ drivers/pci/pcie/portdrv_core.c:254:6: note: Assuming the condition is false if (pci_find_ext_capability(dev, PCI_EXT_CAP_ID_DPC) && ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/pci/pcie/portdrv_core.c:254:55: note: Left side of '&&' is false if (pci_find_ext_capability(dev, PCI_EXT_CAP_ID_DPC) && ^ drivers/pci/pcie/portdrv_core.c:259:6: note: Assuming the condition is true if (pci_pcie_type(dev) == PCI_EXP_TYPE_DOWNSTREAM || ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/pci/pcie/portdrv_core.c:259:52: note: Left side of '||' is true if (pci_pcie_type(dev) == PCI_EXP_TYPE_DOWNSTREAM || ^ drivers/pci/pcie/portdrv_core.c:263:2: note: Returning the value 20 (loaded from 'services'), which participates in a condition later return services; ^~~~~~~~~~~~~~~ drivers/pci/pcie/portdrv_core.c:324:17: note: Returning from 'get_port_device_capability' capabilities = get_port_device_capability(dev); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/pci/pcie/portdrv_core.c:325:7: note: 'capabilities' is 20 if (!capabilities) ^~~~~~~~~~~~ drivers/pci/pcie/portdrv_core.c:325:2: note: Taking false branch if (!capabilities) ^ drivers/pci/pcie/portdrv_core.c:331:2: note: Taking true branch if (IS_ENABLED(CONFIG_PCIE_PME)) ^ drivers/pci/pcie/portdrv_core.c:333:2: note: Taking true branch if (IS_ENABLED(CONFIG_PCIEAER)) ^ drivers/pci/pcie/portdrv_core.c:335:2: note: Taking false branch if (IS_ENABLED(CONFIG_HOTPLUG_PCI_PCIE)) ^ drivers/pci/pcie/portdrv_core.c:337:2: note: Taking false branch if (IS_ENABLED(CONFIG_PCIE_DPC)) ^ drivers/pci/pcie/portdrv_core.c:341:6: note: 'irq_services' is 0 if (irq_services) { ^~~~~~~~~~~~ drivers/pci/pcie/portdrv_core.c:341:2: note: Taking false branch if (irq_services) { ^ drivers/pci/pcie/portdrv_core.c:360:2: note: Loop condition is true. Entering loop body for (i = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) { ^ drivers/pci/pcie/portdrv_core.c:362:3: note: Taking true branch if (!(capabilities & service)) ^ drivers/pci/pcie/portdrv_core.c:363:4: note: Execution continues on line 360 continue; ^ drivers/pci/pcie/portdrv_core.c:360:2: note: Loop condition is true. Entering loop body for (i = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) { ^ drivers/pci/pcie/portdrv_core.c:362:3: note: Taking true branch if (!(capabilities & service)) ^ vim +364 drivers/pci/pcie/portdrv_core.c 8f3acca9acec15 Bjorn Helgaas 2013-12-19 305 facf6d1627a33b Rafael J. Wysocki 2009-01-01 306 /** facf6d1627a33b Rafael J. Wysocki 2009-01-01 307 * pcie_port_device_register - register PCI Express port facf6d1627a33b Rafael J. Wysocki 2009-01-01 308 * @dev: PCI Express port to register facf6d1627a33b Rafael J. Wysocki 2009-01-01 309 * facf6d1627a33b Rafael J. Wysocki 2009-01-01 310 * Allocate the port extension structure and register services associated with facf6d1627a33b Rafael J. Wysocki 2009-01-01 311 * the port. facf6d1627a33b Rafael J. Wysocki 2009-01-01 312 */ ^1da177e4c3f41 Linus Torvalds 2005-04-16 313 int pcie_port_device_register(struct pci_dev *dev) ^1da177e4c3f41 Linus Torvalds 2005-04-16 314 { 30b9aea30a820b Jan Kiszka 2021-08-20 315 int status, capabilities, irq_services, i, nr_service; dc5351784eb36f Kenji Kaneshige 2009-11-25 316 int irqs[PCIE_PORT_DEVICE_MAXSERVICES]; ^1da177e4c3f41 Linus Torvalds 2005-04-16 317 1ce5e83063bf38 Kenji Kaneshige 2009-11-25 318 /* Enable PCI Express port device */ 1ce5e83063bf38 Kenji Kaneshige 2009-11-25 319 status = pci_enable_device(dev); 1ce5e83063bf38 Kenji Kaneshige 2009-11-25 320 if (status) 694f88ef7ada0d Kenji Kaneshige 2009-11-25 321 return status; fe31e69740eddc Rafael J. Wysocki 2010-12-19 322 fe31e69740eddc Rafael J. Wysocki 2010-12-19 323 /* Get and check PCI Express port services */ fe31e69740eddc Rafael J. Wysocki 2010-12-19 324 capabilities = get_port_device_capability(dev); eca67315e0e0d5 Naga Chumbalkar 2011-03-21 325 if (!capabilities) fe31e69740eddc Rafael J. Wysocki 2010-12-19 326 return 0; fe31e69740eddc Rafael J. Wysocki 2010-12-19 327 1ce5e83063bf38 Kenji Kaneshige 2009-11-25 328 pci_set_master(dev); 30b9aea30a820b Jan Kiszka 2021-08-20 329 30b9aea30a820b Jan Kiszka 2021-08-20 330 irq_services = 0; 30b9aea30a820b Jan Kiszka 2021-08-20 331 if (IS_ENABLED(CONFIG_PCIE_PME)) 30b9aea30a820b Jan Kiszka 2021-08-20 332 irq_services |= PCIE_PORT_SERVICE_PME; 30b9aea30a820b Jan Kiszka 2021-08-20 333 if (IS_ENABLED(CONFIG_PCIEAER)) 30b9aea30a820b Jan Kiszka 2021-08-20 334 irq_services |= PCIE_PORT_SERVICE_AER; 30b9aea30a820b Jan Kiszka 2021-08-20 335 if (IS_ENABLED(CONFIG_HOTPLUG_PCI_PCIE)) 30b9aea30a820b Jan Kiszka 2021-08-20 336 irq_services |= PCIE_PORT_SERVICE_HP; 30b9aea30a820b Jan Kiszka 2021-08-20 337 if (IS_ENABLED(CONFIG_PCIE_DPC)) 30b9aea30a820b Jan Kiszka 2021-08-20 338 irq_services |= PCIE_PORT_SERVICE_DPC; 30b9aea30a820b Jan Kiszka 2021-08-20 339 irq_services &= capabilities; 30b9aea30a820b Jan Kiszka 2021-08-20 340 30b9aea30a820b Jan Kiszka 2021-08-20 341 if (irq_services) { f118c0c3cff4fe Rafael J. Wysocki 2009-01-13 342 /* dc5351784eb36f Kenji Kaneshige 2009-11-25 343 * Initialize service irqs. Don't use service devices that dc5351784eb36f Kenji Kaneshige 2009-11-25 344 * require interrupts if there is no way to generate them. 30b9aea30a820b Jan Kiszka 2021-08-20 345 * However, some drivers may have a polling mode (e.g. 30b9aea30a820b Jan Kiszka 2021-08-20 346 * pciehp_poll_mode) that can be used in the absence of irqs. 30b9aea30a820b Jan Kiszka 2021-08-20 347 * Allow them to determine if that is to be used. f118c0c3cff4fe Rafael J. Wysocki 2009-01-13 348 */ 30b9aea30a820b Jan Kiszka 2021-08-20 349 status = pcie_init_service_irqs(dev, irqs, irq_services); dc5351784eb36f Kenji Kaneshige 2009-11-25 350 if (status) { 30b9aea30a820b Jan Kiszka 2021-08-20 351 irq_services &= PCIE_PORT_SERVICE_HP; 30b9aea30a820b Jan Kiszka 2021-08-20 352 if (!irq_services) 1ce5e83063bf38 Kenji Kaneshige 2009-11-25 353 goto error_disable; f118c0c3cff4fe Rafael J. Wysocki 2009-01-13 354 } 30b9aea30a820b Jan Kiszka 2021-08-20 355 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 356 ^1da177e4c3f41 Linus Torvalds 2005-04-16 357 /* Allocate child services if any */ 40717c39b1e6c0 Kenji Kaneshige 2009-11-25 358 status = -ENODEV; 40717c39b1e6c0 Kenji Kaneshige 2009-11-25 359 nr_service = 0; 40717c39b1e6c0 Kenji Kaneshige 2009-11-25 360 for (i = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) { 90e9cd50f7feed Rafael J. Wysocki 2009-01-13 361 int service = 1 << i; 90e9cd50f7feed Rafael J. Wysocki 2009-01-13 362 if (!(capabilities & service)) 90e9cd50f7feed Rafael J. Wysocki 2009-01-13 363 continue; 40717c39b1e6c0 Kenji Kaneshige 2009-11-25 @364 if (!pcie_device_init(dev, service, irqs[i])) 40717c39b1e6c0 Kenji Kaneshige 2009-11-25 365 nr_service++; f118c0c3cff4fe Rafael J. Wysocki 2009-01-13 366 } 40717c39b1e6c0 Kenji Kaneshige 2009-11-25 367 if (!nr_service) fbb5de70bbe13e Kenji Kaneshige 2009-11-25 368 goto error_cleanup_irqs; 40717c39b1e6c0 Kenji Kaneshige 2009-11-25 369 ^1da177e4c3f41 Linus Torvalds 2005-04-16 370 return 0; f118c0c3cff4fe Rafael J. Wysocki 2009-01-13 371 fbb5de70bbe13e Kenji Kaneshige 2009-11-25 372 error_cleanup_irqs: 3674cc49da9a8f Christoph Hellwig 2017-02-01 373 pci_free_irq_vectors(dev); 1ce5e83063bf38 Kenji Kaneshige 2009-11-25 374 error_disable: 1ce5e83063bf38 Kenji Kaneshige 2009-11-25 375 pci_disable_device(dev); f118c0c3cff4fe Rafael J. Wysocki 2009-01-13 376 return status; ^1da177e4c3f41 Linus Torvalds 2005-04-16 377 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 378 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/[email protected]
.config.gz
Description: application/gzip
_______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
