Message ID | 20170104004826.17866.77074.stgit@localhost6.localdomain6 (mailing list archive) |
---|---|
State | New, archived |
Delegated to: | Bjorn Helgaas |
Headers | show |
Hi Emil, [auto build test ERROR on pci/next] [also build test ERROR on v4.10-rc2 next-20170104] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Emil-Tantilov/PCI-introduce-locked-pci_add-remove_virtfn/20170104-193518 base: https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git next config: powerpc-defconfig (attached as .config) compiler: powerpc64-linux-gnu-gcc (Debian 6.1.1-9) 6.1.1 20160705 reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=powerpc All errors (new ones prefixed by >>): arch/powerpc/kernel/eeh_driver.c: In function 'eeh_add_virt_device': >> arch/powerpc/kernel/eeh_driver.c:444:2: error: implicit declaration of function 'pci_iov_add_virtfn_locked' [-Werror=implicit-function-declaration] pci_iov_add_virtfn_locked(edev->physfn, pdn->vf_index, 0); ^~~~~~~~~~~~~~~~~~~~~~~~~ arch/powerpc/kernel/eeh_driver.c: In function 'eeh_rmv_device': >> arch/powerpc/kernel/eeh_driver.c:502:3: error: implicit declaration of function 'pci_iov_remove_virtfn_locked' [-Werror=implicit-function-declaration] pci_iov_remove_virtfn_locked(edev->physfn, pdn->vf_index, 0); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ cc1: all warnings being treated as errors vim +/pci_iov_add_virtfn_locked +444 arch/powerpc/kernel/eeh_driver.c 438 eeh_pcid_put(dev); 439 if (driver->err_handler) 440 return NULL; 441 } 442 443 #ifdef CONFIG_PPC_POWERNV > 444 pci_iov_add_virtfn_locked(edev->physfn, pdn->vf_index, 0); 445 #endif 446 return NULL; 447 } 448 449 static void *eeh_rmv_device(void *data, void *userdata) 450 { 451 struct pci_driver *driver; 452 struct eeh_dev *edev = (struct eeh_dev *)data; 453 struct pci_dev *dev = eeh_dev_to_pci_dev(edev); 454 struct eeh_rmv_data *rmv_data = (struct eeh_rmv_data *)userdata; 455 int *removed = rmv_data ? &rmv_data->removed : NULL; 456 457 /* 458 * Actually, we should remove the PCI bridges as well. 459 * However, that's lots of complexity to do that, 460 * particularly some of devices under the bridge might 461 * support EEH. So we just care about PCI devices for 462 * simplicity here. 463 */ 464 if (!dev || (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE)) 465 return NULL; 466 467 /* 468 * We rely on count-based pcibios_release_device() to 469 * detach permanently offlined PEs. Unfortunately, that's 470 * not reliable enough. We might have the permanently 471 * offlined PEs attached, but we needn't take care of 472 * them and their child devices. 473 */ 474 if (eeh_dev_removed(edev)) 475 return NULL; 476 477 driver = eeh_pcid_get(dev); 478 if (driver) { 479 eeh_pcid_put(dev); 480 if (removed && 481 eeh_pe_passed(edev->pe)) 482 return NULL; 483 if (removed && 484 driver->err_handler && 485 driver->err_handler->error_detected && 486 driver->err_handler->slot_reset) 487 return NULL; 488 } 489 490 /* Remove it from PCI subsystem */ 491 pr_debug("EEH: Removing %s without EEH sensitive driver\n", 492 pci_name(dev)); 493 edev->bus = dev->bus; 494 edev->mode |= EEH_DEV_DISCONNECTED; 495 if (removed) 496 (*removed)++; 497 498 if (edev->physfn) { 499 #ifdef CONFIG_PPC_POWERNV 500 struct pci_dn *pdn = eeh_dev_to_pdn(edev); 501 > 502 pci_iov_remove_virtfn_locked(edev->physfn, pdn->vf_index, 0); 503 edev->pdev = NULL; 504 505 /* --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c index d88573b..81aaea7 100644 --- a/arch/powerpc/kernel/eeh_driver.c +++ b/arch/powerpc/kernel/eeh_driver.c @@ -441,7 +441,7 @@ static void *eeh_add_virt_device(void *data, void *userdata) } #ifdef CONFIG_PPC_POWERNV - pci_iov_add_virtfn(edev->physfn, pdn->vf_index, 0); + pci_iov_add_virtfn_locked(edev->physfn, pdn->vf_index, 0); #endif return NULL; } @@ -499,7 +499,7 @@ static void *eeh_rmv_device(void *data, void *userdata) #ifdef CONFIG_PPC_POWERNV struct pci_dn *pdn = eeh_dev_to_pdn(edev); - pci_iov_remove_virtfn(edev->physfn, pdn->vf_index, 0); + pci_iov_remove_virtfn_locked(edev->physfn, pdn->vf_index, 0); edev->pdev = NULL; /* diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c index 4722782..fea322db 100644 --- a/drivers/pci/iov.c +++ b/drivers/pci/iov.c @@ -113,7 +113,7 @@ resource_size_t pci_iov_resource_size(struct pci_dev *dev, int resno) return dev->sriov->barsz[resno - PCI_IOV_RESOURCES]; } -int pci_iov_add_virtfn(struct pci_dev *dev, int id, int reset) +static int pci_iov_add_virtfn(struct pci_dev *dev, int id, int reset) { int i; int rc = -ENOMEM; @@ -124,7 +124,6 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id, int reset) struct pci_sriov *iov = dev->sriov; struct pci_bus *bus; - mutex_lock(&iov->dev->sriov->lock); bus = virtfn_add_bus(dev->bus, pci_iov_virtfn_bus(dev, id)); if (!bus) goto failed; @@ -162,7 +161,6 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id, int reset) __pci_reset_function(virtfn); pci_device_add(virtfn, virtfn->bus); - mutex_unlock(&iov->dev->sriov->lock); pci_bus_add_device(virtfn); sprintf(buf, "virtfn%u", id); @@ -191,11 +189,22 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id, int reset) return rc; } -void pci_iov_remove_virtfn(struct pci_dev *dev, int id, int reset) +int pci_iov_add_virtfn_locked(struct pci_dev *dev, int id, int reset) +{ + struct pci_sriov *iov = dev->sriov; + int rc; + + mutex_lock(&iov->dev->sriov->lock); + rc = pci_iov_add_virtfn(dev, id, reset); + mutex_unlock(&iov->dev->sriov->lock); + + return rc; +} + +static void pci_iov_remove_virtfn(struct pci_dev *dev, int id, int reset) { char buf[VIRTFN_ID_LEN]; struct pci_dev *virtfn; - struct pci_sriov *iov = dev->sriov; virtfn = pci_get_domain_bus_and_slot(pci_domain_nr(dev->bus), pci_iov_virtfn_bus(dev, id), @@ -218,16 +227,24 @@ void pci_iov_remove_virtfn(struct pci_dev *dev, int id, int reset) if (virtfn->dev.kobj.sd) sysfs_remove_link(&virtfn->dev.kobj, "physfn"); - mutex_lock(&iov->dev->sriov->lock); pci_stop_and_remove_bus_device(virtfn); virtfn_remove_bus(dev->bus, virtfn->bus); - mutex_unlock(&iov->dev->sriov->lock); /* balance pci_get_domain_bus_and_slot() */ pci_dev_put(virtfn); pci_dev_put(dev); } +void pci_iov_remove_virtfn_locked(struct pci_dev *dev, int id, int reset) +{ + struct pci_sriov *iov = dev->sriov; + + mutex_lock(&iov->dev->sriov->lock); + pci_iov_remove_virtfn(dev, id, reset); + mutex_unlock(&iov->dev->sriov->lock); +} + + int __weak pcibios_sriov_enable(struct pci_dev *pdev, u16 num_vfs) { return 0; diff --git a/include/linux/pci.h b/include/linux/pci.h index e2d1a12..4351ceb7 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -1872,8 +1872,8 @@ static inline void pci_mmcfg_late_init(void) { } int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn); void pci_disable_sriov(struct pci_dev *dev); -int pci_iov_add_virtfn(struct pci_dev *dev, int id, int reset); -void pci_iov_remove_virtfn(struct pci_dev *dev, int id, int reset); +int pci_iov_add_virtfn_locked(struct pci_dev *dev, int id, int reset); +void pci_iov_remove_virtfn_locked(struct pci_dev *dev, int id, int reset); int pci_num_vf(struct pci_dev *dev); int pci_vfs_assigned(struct pci_dev *dev); int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs);
This is to allow moving the mutex lock outside of pci_iov_add/rem_virtfn() for enabling/disabling SRIOV, while still making it possible to call the _locked version like it is the case for PPC's eeh_driver. CC: Alexander Duyck <alexander.h.duyck@intel.com> Signed-off-by: Emil Tantilov <emil.s.tantilov@intel.com> --- arch/powerpc/kernel/eeh_driver.c | 4 ++-- drivers/pci/iov.c | 31 ++++++++++++++++++++++++------- include/linux/pci.h | 4 ++-- 3 files changed, 28 insertions(+), 11 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html