* [PATCH v5 00/11] PCI: Drop duplicated tracking of a pci_dev's bound driver
@ 2021-09-29 8:52 Uwe Kleine-König
2021-09-29 8:53 ` [PATCH v5 05/11] powerpc/eeh: Don't use driver member of struct pci_dev and further cleanups Uwe Kleine-König
` (2 more replies)
0 siblings, 3 replies; 11+ messages in thread
From: Uwe Kleine-König @ 2021-09-29 8:52 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: Giovanni Cabiddu, Mark Rutland, Sathya Prakash,
Alexander Shishkin, linux-pci, Alexander Duyck, x86, qat-linux,
oss-drivers, Oliver O'Halloran, H. Peter Anvin, Jiri Olsa,
Christoph Hellwig, Marco Chiappero, Stefano Stabellini,
Herbert Xu, linux-scsi, Rafał Miłecki, Jesse Brandeburg,
Peter Zijlstra, Ingo Molnar, linux-wireless, Jakub Kicinski,
Yisen Zhuang, Suganath Prabu Subramani, Fiona Trahe,
Andrew Donnellan, Arnd Bergmann, Konrad Rzeszutek Wilk,
Ido Schimmel, Simon Horman, linuxppc-dev,
Arnaldo Carvalho de Melo, Jack Xu, Borislav Petkov,
Michael Buesch, Jiri Pirko, Bjorn Helgaas, Namhyung Kim,
Boris Ostrovsky, Andy Shevchenko, Juergen Gross, Salil Mehta,
Sreekanth Reddy, xen-devel, Vadym Kochan, MPT-FusionLinux.pdl,
Greg Kroah-Hartman, linux-usb, Wojciech Ziemba, linux-kernel,
Mathias Nyman, Zhou Wang, Thomas Gleixner, linux-crypto, kernel,
netdev, Frederic Barrat, Paul Mackerras, Tomaszx Kowalik,
Taras Chornyi, David S. Miller, linux-perf-users
Hello,
this is v5 of the quest to drop the "driver" member from struct pci_dev
which tracks the same data (apart from a constant offset) as dev.driver.
Changes since v4:
- split some changes out of "PCI: replace pci_dev::driver usage that
gets the driver name" and reworked them a bit as suggested by Bjorn.
- Add a line break in
drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c to please
checkpatch --strict and Simon Horman.
- Fixed a build problem in "crypto: qat - simplify adf_enable_aer()",
thanks to Giovanni Cabiddu for spotting and a suggested fix.
I didn't replace :: by . as suggested by Bjorn as I'm unsure if his
preference is stronger than mine.
This patch stack survived an allmodconfig build on arm64, m68k, powerpc,
riscv, s390, sparc64 and x86_64 on top of v5.15-rc3.
Best regards
Uwe
Uwe Kleine-König (11):
PCI: Simplify pci_device_remove()
PCI: Drop useless check from pci_device_probe()
xen/pci: Drop some checks that are always true
bcma: simplify reference to the driver's name
powerpc/eeh: Don't use driver member of struct pci_dev and further
cleanups
ssb: Simplify determination of driver name
PCI: Replace pci_dev::driver usage that gets the driver name
scsi: message: fusion: Remove unused parameter of mpt_pci driver's
probe()
crypto: qat - simplify adf_enable_aer()
PCI: Replace pci_dev::driver usage by pci_dev::dev.driver
PCI: Drop duplicated tracking of a pci_dev's bound driver
arch/powerpc/include/asm/ppc-pci.h | 5 --
arch/powerpc/kernel/eeh.c | 8 +++
arch/powerpc/kernel/eeh_driver.c | 10 +--
arch/x86/events/intel/uncore.c | 2 +-
arch/x86/kernel/probe_roms.c | 2 +-
drivers/bcma/host_pci.c | 6 +-
drivers/crypto/hisilicon/qm.c | 2 +-
drivers/crypto/qat/qat_4xxx/adf_drv.c | 7 +--
drivers/crypto/qat/qat_c3xxx/adf_drv.c | 7 +--
drivers/crypto/qat/qat_c62x/adf_drv.c | 7 +--
drivers/crypto/qat/qat_common/adf_aer.c | 10 +--
.../crypto/qat/qat_common/adf_common_drv.h | 3 +-
drivers/crypto/qat/qat_dh895xcc/adf_drv.c | 7 +--
drivers/message/fusion/mptbase.c | 7 +--
drivers/message/fusion/mptbase.h | 2 +-
drivers/message/fusion/mptctl.c | 4 +-
drivers/message/fusion/mptlan.c | 2 +-
drivers/misc/cxl/guest.c | 24 ++++---
drivers/misc/cxl/pci.c | 30 +++++----
.../ethernet/hisilicon/hns3/hns3_ethtool.c | 2 +-
.../ethernet/marvell/prestera/prestera_pci.c | 2 +-
drivers/net/ethernet/mellanox/mlxsw/pci.c | 2 +-
.../ethernet/netronome/nfp/nfp_net_ethtool.c | 3 +-
drivers/pci/iov.c | 25 +++++---
drivers/pci/pci-driver.c | 45 ++++++-------
drivers/pci/pci.c | 4 +-
drivers/pci/pcie/err.c | 36 ++++++-----
drivers/pci/xen-pcifront.c | 63 +++++++++----------
drivers/ssb/pcihost_wrapper.c | 6 +-
drivers/usb/host/xhci-pci.c | 2 +-
include/linux/pci.h | 1 -
31 files changed, 161 insertions(+), 175 deletions(-)
Range-diff against v4:
1: 8d064bbc74b0 = 1: c2b53ab26a6b PCI: Simplify pci_device_remove()
2: 966b49c308b4 = 2: 2c733e1d5186 PCI: Drop useless check from pci_device_probe()
3: ce710d6e8a1b = 3: 547ca5a7aa16 xen/pci: Drop some checks that are always true
-: ------------ > 4: 40eb07353844 bcma: simplify reference to the driver's name
-: ------------ > 5: bab59c1dff6d powerpc/eeh: Don't use driver member of struct pci_dev and further cleanups
-: ------------ > 6: abd70de9782d ssb: Simplify determination of driver name
4: 3e4e6994a59d ! 7: 735845bd26b9 PCI: replace pci_dev::driver usage that gets the driver name
@@ Metadata
Author: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
## Commit message ##
- PCI: replace pci_dev::driver usage that gets the driver name
+ PCI: Replace pci_dev::driver usage that gets the driver name
struct pci_dev::driver holds (apart from a constant offset) the same
data as struct pci_dev::dev->driver. With the goal to remove struct
@@ Commit message
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
- ## arch/powerpc/include/asm/ppc-pci.h ##
-@@ arch/powerpc/include/asm/ppc-pci.h: void eeh_sysfs_remove_device(struct pci_dev *pdev);
-
- static inline const char *eeh_driver_name(struct pci_dev *pdev)
- {
-- return (pdev && pdev->driver) ? pdev->driver->name : "<null>";
-+ if (pdev) {
-+ const char *drvstr = dev_driver_string(&pdev->dev);
-+
-+ if (strcmp(drvstr, ""))
-+ return drvstr;
-+ }
-+
-+ return "<null>";
- }
-
- #endif /* CONFIG_EEH */
-
- ## drivers/bcma/host_pci.c ##
-@@ drivers/bcma/host_pci.c: static int bcma_host_pci_probe(struct pci_dev *dev,
- if (err)
- goto err_kfree_bus;
-
-- name = dev_name(&dev->dev);
-- if (dev->driver && dev->driver->name)
-- name = dev->driver->name;
-+ name = dev_driver_string(&dev->dev);
-+ if (!strcmp(name, ""))
-+ name = dev_name(&dev->dev);
-+
- err = pci_request_regions(dev, name);
- if (err)
- goto err_pci_disable;
-
## drivers/crypto/hisilicon/qm.c ##
@@ drivers/crypto/hisilicon/qm.c: static int qm_alloc_uacce(struct hisi_qm *qm)
};
@@ drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c: nfp_get_drvinfo(struct nfp
char nsp_version[ETHTOOL_FWVERS_LEN] = {};
- strlcpy(drvinfo->driver, pdev->driver->name, sizeof(drvinfo->driver));
-+ strlcpy(drvinfo->driver, dev_driver_string(&pdev->dev), sizeof(drvinfo->driver));
++ strlcpy(drvinfo->driver, dev_driver_string(&pdev->dev),
++ sizeof(drvinfo->driver));
nfp_net_get_nspinfo(app, nsp_version);
snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),
"%s %s %s %s", vnic_version, nsp_version,
-
- ## drivers/ssb/pcihost_wrapper.c ##
-@@ drivers/ssb/pcihost_wrapper.c: static int ssb_pcihost_probe(struct pci_dev *dev,
- err = pci_enable_device(dev);
- if (err)
- goto err_kfree_ssb;
-- name = dev_name(&dev->dev);
-- if (dev->driver && dev->driver->name)
-- name = dev->driver->name;
-+
-+ name = dev_driver_string(&dev->dev);
-+ if (*name == '\0')
-+ name = dev_name(&dev->dev);
-+
- err = pci_request_regions(dev, name);
- if (err)
- goto err_pci_disable;
5: 574b743327b8 = 8: 1e58019165b9 scsi: message: fusion: Remove unused parameter of mpt_pci driver's probe()
6: 674c6efd3dab ! 9: dea72a470141 crypto: qat - simplify adf_enable_aer()
@@ drivers/crypto/qat/qat_4xxx/adf_drv.c: static struct pci_driver adf_driver = {
.probe = adf_probe,
.remove = adf_remove,
.sriov_configure = adf_sriov_configure,
-+ .err_handler = adf_err_handler,
++ .err_handler = &adf_err_handler,
};
module_pci_driver(adf_driver);
@@ drivers/crypto/qat/qat_c3xxx/adf_drv.c: static struct pci_driver adf_driver = {
.probe = adf_probe,
.remove = adf_remove,
.sriov_configure = adf_sriov_configure,
-+ .err_handler = adf_err_handler,
++ .err_handler = &adf_err_handler,
};
static void adf_cleanup_pci_dev(struct adf_accel_dev *accel_dev)
@@ drivers/crypto/qat/qat_c62x/adf_drv.c: static struct pci_driver adf_driver = {
.probe = adf_probe,
.remove = adf_remove,
.sriov_configure = adf_sriov_configure,
-+ .err_handler = adf_err_handler,
++ .err_handler = &adf_err_handler,
};
static void adf_cleanup_pci_dev(struct adf_accel_dev *accel_dev)
@@ drivers/crypto/qat/qat_common/adf_common_drv.h: void adf_ae_fw_release(struct ad
int adf_ae_stop(struct adf_accel_dev *accel_dev);
-int adf_enable_aer(struct adf_accel_dev *accel_dev);
++extern const struct pci_error_handlers adf_err_handler;
+void adf_enable_aer(struct adf_accel_dev *accel_dev);
void adf_disable_aer(struct adf_accel_dev *accel_dev);
void adf_reset_sbr(struct adf_accel_dev *accel_dev);
@@ drivers/crypto/qat/qat_dh895xcc/adf_drv.c: static struct pci_driver adf_driver =
.probe = adf_probe,
.remove = adf_remove,
.sriov_configure = adf_sriov_configure,
-+ .err_handler = adf_err_handler,
++ .err_handler = &adf_err_handler,
};
static void adf_cleanup_pci_dev(struct adf_accel_dev *accel_dev)
7: 0e022deb0f75 = 10: b4165dda38ea PCI: Replace pci_dev::driver usage by pci_dev::dev.driver
8: edd9d24df02a = 11: d93a138bd7ab PCI: Drop duplicated tracking of a pci_dev's bound driver
base-commit: 5816b3e6577eaa676ceb00a848f0fd65fe2adc29
--
2.30.2
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH v5 05/11] powerpc/eeh: Don't use driver member of struct pci_dev and further cleanups 2021-09-29 8:52 [PATCH v5 00/11] PCI: Drop duplicated tracking of a pci_dev's bound driver Uwe Kleine-König @ 2021-09-29 8:53 ` Uwe Kleine-König 2021-09-29 8:53 ` [PATCH v5 07/11] PCI: Replace pci_dev::driver usage that gets the driver name Uwe Kleine-König 2021-09-29 8:53 ` [PATCH v5 10/11] PCI: Replace pci_dev::driver usage by pci_dev::dev.driver Uwe Kleine-König 2 siblings, 0 replies; 11+ messages in thread From: Uwe Kleine-König @ 2021-09-29 8:53 UTC (permalink / raw) To: Bjorn Helgaas, Michael Ellerman Cc: linux-pci, Paul Mackerras, kernel, Oliver O'Halloran, linuxppc-dev, Christoph Hellwig The driver member of struct pci_dev is to be removed as it tracks information already present by tracking of the driver core. So replace pdev->driver->name by dev_driver_string() for the corresponding struct device. Also move the function nearer to its only user and instead of the ?: operator use a normal if which is more readable. Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> --- arch/powerpc/include/asm/ppc-pci.h | 5 ----- arch/powerpc/kernel/eeh.c | 8 ++++++++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/arch/powerpc/include/asm/ppc-pci.h b/arch/powerpc/include/asm/ppc-pci.h index 2b9edbf6e929..f6cf0159024e 100644 --- a/arch/powerpc/include/asm/ppc-pci.h +++ b/arch/powerpc/include/asm/ppc-pci.h @@ -55,11 +55,6 @@ void eeh_pe_dev_mode_mark(struct eeh_pe *pe, int mode); void eeh_sysfs_add_device(struct pci_dev *pdev); void eeh_sysfs_remove_device(struct pci_dev *pdev); -static inline const char *eeh_driver_name(struct pci_dev *pdev) -{ - return (pdev && pdev->driver) ? pdev->driver->name : "<null>"; -} - #endif /* CONFIG_EEH */ #define PCI_BUSNO(bdfn) ((bdfn >> 8) & 0xff) diff --git a/arch/powerpc/kernel/eeh.c b/arch/powerpc/kernel/eeh.c index e9b597ed423c..4b08881c4a1e 100644 --- a/arch/powerpc/kernel/eeh.c +++ b/arch/powerpc/kernel/eeh.c @@ -399,6 +399,14 @@ static int eeh_phb_check_failure(struct eeh_pe *pe) return ret; } +static inline const char *eeh_driver_name(struct pci_dev *pdev) +{ + if (pdev) + return dev_driver_string(&pdev->dev); + + return "<null>"; +} + /** * eeh_dev_check_failure - Check if all 1's data is due to EEH slot freeze * @edev: eeh device -- 2.30.2 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v5 07/11] PCI: Replace pci_dev::driver usage that gets the driver name 2021-09-29 8:52 [PATCH v5 00/11] PCI: Drop duplicated tracking of a pci_dev's bound driver Uwe Kleine-König 2021-09-29 8:53 ` [PATCH v5 05/11] powerpc/eeh: Don't use driver member of struct pci_dev and further cleanups Uwe Kleine-König @ 2021-09-29 8:53 ` Uwe Kleine-König 2021-09-29 10:17 ` Simon Horman 2021-09-29 14:44 ` Ido Schimmel 2021-09-29 8:53 ` [PATCH v5 10/11] PCI: Replace pci_dev::driver usage by pci_dev::dev.driver Uwe Kleine-König 2 siblings, 2 replies; 11+ messages in thread From: Uwe Kleine-König @ 2021-09-29 8:53 UTC (permalink / raw) To: Bjorn Helgaas Cc: linux-pci, Alexander Duyck, oss-drivers, Paul Mackerras, Christoph Hellwig, Herbert Xu, Rafał Miłecki, Jesse Brandeburg, Ido Schimmel, Jakub Kicinski, Yisen Zhuang, Vadym Kochan, Michael Buesch, Jiri Pirko, Salil Mehta, netdev, linux-wireless, linux-kernel, Taras Chornyi, Zhou Wang, linux-crypto, kernel, Simon Horman, Oliver O'Halloran, linuxppc-dev, David S. Miller struct pci_dev::driver holds (apart from a constant offset) the same data as struct pci_dev::dev->driver. With the goal to remove struct pci_dev::driver to get rid of data duplication replace getting the driver name by dev_driver_string() which implicitly makes use of struct pci_dev::dev->driver. Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> --- drivers/crypto/hisilicon/qm.c | 2 +- drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c | 2 +- drivers/net/ethernet/marvell/prestera/prestera_pci.c | 2 +- drivers/net/ethernet/mellanox/mlxsw/pci.c | 2 +- drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c | 3 ++- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/crypto/hisilicon/qm.c b/drivers/crypto/hisilicon/qm.c index 369562d34d66..8f361e54e524 100644 --- a/drivers/crypto/hisilicon/qm.c +++ b/drivers/crypto/hisilicon/qm.c @@ -3085,7 +3085,7 @@ static int qm_alloc_uacce(struct hisi_qm *qm) }; int ret; - ret = strscpy(interface.name, pdev->driver->name, + ret = strscpy(interface.name, dev_driver_string(&pdev->dev), sizeof(interface.name)); if (ret < 0) return -ENAMETOOLONG; diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c index 7ea511d59e91..f279edfce3f1 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c @@ -606,7 +606,7 @@ static void hns3_get_drvinfo(struct net_device *netdev, return; } - strncpy(drvinfo->driver, h->pdev->driver->name, + strncpy(drvinfo->driver, dev_driver_string(&h->pdev->dev), sizeof(drvinfo->driver)); drvinfo->driver[sizeof(drvinfo->driver) - 1] = '\0'; diff --git a/drivers/net/ethernet/marvell/prestera/prestera_pci.c b/drivers/net/ethernet/marvell/prestera/prestera_pci.c index a250d394da38..a8f007f6dad2 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_pci.c +++ b/drivers/net/ethernet/marvell/prestera/prestera_pci.c @@ -720,7 +720,7 @@ static int prestera_fw_load(struct prestera_fw *fw) static int prestera_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { - const char *driver_name = pdev->driver->name; + const char *driver_name = dev_driver_string(&pdev->dev); struct prestera_fw *fw; int err; diff --git a/drivers/net/ethernet/mellanox/mlxsw/pci.c b/drivers/net/ethernet/mellanox/mlxsw/pci.c index 13b0259f7ea6..8f306364f7bf 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/pci.c +++ b/drivers/net/ethernet/mellanox/mlxsw/pci.c @@ -1876,7 +1876,7 @@ static void mlxsw_pci_cmd_fini(struct mlxsw_pci *mlxsw_pci) static int mlxsw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { - const char *driver_name = pdev->driver->name; + const char *driver_name = dev_driver_string(&pdev->dev); struct mlxsw_pci *mlxsw_pci; int err; diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c b/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c index 0685ece1f155..1de076f55740 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c @@ -202,7 +202,8 @@ nfp_get_drvinfo(struct nfp_app *app, struct pci_dev *pdev, { char nsp_version[ETHTOOL_FWVERS_LEN] = {}; - strlcpy(drvinfo->driver, pdev->driver->name, sizeof(drvinfo->driver)); + strlcpy(drvinfo->driver, dev_driver_string(&pdev->dev), + sizeof(drvinfo->driver)); nfp_net_get_nspinfo(app, nsp_version); snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version), "%s %s %s %s", vnic_version, nsp_version, -- 2.30.2 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v5 07/11] PCI: Replace pci_dev::driver usage that gets the driver name 2021-09-29 8:53 ` [PATCH v5 07/11] PCI: Replace pci_dev::driver usage that gets the driver name Uwe Kleine-König @ 2021-09-29 10:17 ` Simon Horman 2021-09-29 14:44 ` Ido Schimmel 1 sibling, 0 replies; 11+ messages in thread From: Simon Horman @ 2021-09-29 10:17 UTC (permalink / raw) To: Uwe Kleine-König Cc: linux-pci, Alexander Duyck, oss-drivers, Paul Mackerras, Christoph Hellwig, Herbert Xu, Rafał Miłecki, Jesse Brandeburg, Bjorn Helgaas, Ido Schimmel, Jakub Kicinski, Yisen Zhuang, Vadym Kochan, Michael Buesch, Jiri Pirko, Salil Mehta, netdev, linux-wireless, linux-kernel, Taras Chornyi, Zhou Wang, linux-crypto, kernel, Oliver O'Halloran, linuxppc-dev, David S. Miller On Wed, Sep 29, 2021 at 10:53:02AM +0200, Uwe Kleine-König wrote: > struct pci_dev::driver holds (apart from a constant offset) the same > data as struct pci_dev::dev->driver. With the goal to remove struct > pci_dev::driver to get rid of data duplication replace getting the > driver name by dev_driver_string() which implicitly makes use of struct > pci_dev::dev->driver. > > Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> > --- > drivers/crypto/hisilicon/qm.c | 2 +- > drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c | 2 +- > drivers/net/ethernet/marvell/prestera/prestera_pci.c | 2 +- > drivers/net/ethernet/mellanox/mlxsw/pci.c | 2 +- > drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c | 3 ++- > 5 files changed, 6 insertions(+), 5 deletions(-) Thanks Uwe. For NFP: Acked-by: Simon Horman <simon.horman@corigine.com> ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v5 07/11] PCI: Replace pci_dev::driver usage that gets the driver name 2021-09-29 8:53 ` [PATCH v5 07/11] PCI: Replace pci_dev::driver usage that gets the driver name Uwe Kleine-König 2021-09-29 10:17 ` Simon Horman @ 2021-09-29 14:44 ` Ido Schimmel 2021-09-29 15:21 ` Ido Schimmel 1 sibling, 1 reply; 11+ messages in thread From: Ido Schimmel @ 2021-09-29 14:44 UTC (permalink / raw) To: Uwe Kleine-König Cc: linux-pci, Alexander Duyck, oss-drivers, Paul Mackerras, Christoph Hellwig, Herbert Xu, Rafał Miłecki, Jesse Brandeburg, Bjorn Helgaas, Jakub Kicinski, Yisen Zhuang, Vadym Kochan, Michael Buesch, Jiri Pirko, Salil Mehta, netdev, linux-wireless, linux-kernel, Taras Chornyi, Zhou Wang, linux-crypto, kernel, Simon Horman, Oliver O'Halloran, linuxppc-dev, David S. Miller On Wed, Sep 29, 2021 at 10:53:02AM +0200, Uwe Kleine-König wrote: > struct pci_dev::driver holds (apart from a constant offset) the same > data as struct pci_dev::dev->driver. With the goal to remove struct > pci_dev::driver to get rid of data duplication replace getting the > driver name by dev_driver_string() which implicitly makes use of struct > pci_dev::dev->driver. > > Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> For mlxsw: Reviewed-by: Ido Schimmel <idosch@nvidia.com> Tested-by: Ido Schimmel <idosch@nvidia.com> Thanks ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v5 07/11] PCI: Replace pci_dev::driver usage that gets the driver name 2021-09-29 14:44 ` Ido Schimmel @ 2021-09-29 15:21 ` Ido Schimmel 0 siblings, 0 replies; 11+ messages in thread From: Ido Schimmel @ 2021-09-29 15:21 UTC (permalink / raw) To: Ido Schimmel, u.kleine-koenig Cc: linux-pci, Alexander Duyck, oss-drivers, Paul Mackerras, Christoph Hellwig, Herbert Xu, Rafał Miłecki, Jesse Brandeburg, Bjorn Helgaas, Jakub Kicinski, Yisen Zhuang, Vadym Kochan, Michael Buesch, Jiri Pirko, Salil Mehta, netdev, linux-wireless, linux-kernel, Taras Chornyi, Zhou Wang, linux-crypto, kernel, Simon Horman, Oliver O'Halloran, linuxppc-dev, David S. Miller On Wed, Sep 29, 2021 at 05:44:51PM +0300, Ido Schimmel wrote: > On Wed, Sep 29, 2021 at 10:53:02AM +0200, Uwe Kleine-König wrote: > > struct pci_dev::driver holds (apart from a constant offset) the same > > data as struct pci_dev::dev->driver. With the goal to remove struct > > pci_dev::driver to get rid of data duplication replace getting the > > driver name by dev_driver_string() which implicitly makes use of struct > > pci_dev::dev->driver. > > > > Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> > > For mlxsw: > > Reviewed-by: Ido Schimmel <idosch@nvidia.com> > Tested-by: Ido Schimmel <idosch@nvidia.com> > > Thanks Actually, I found out that after loading and executing another kernel (or the same one) via kexec I get this splat [1]. [1] BUG: unable to handle page fault for address: ffffffffffffffc8 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 6e40c067 P4D 6e40c067 PUD 6e40e067 PMD 0 Oops: 0000 [#1] SMP CPU: 0 PID: 786 Comm: kexec Not tainted 5.15.0-rc2-custom-45114-g6b0effa5a61f #112 Hardware name: Mellanox Technologies Ltd. MSN3700/VMOD0005, BIOS 5.11 01/06/2019 RIP: 0010:pci_device_shutdown+0x16/0x40 Code: 01 00 31 d2 4c 89 e7 89 c6 e8 36 ce 01 00 41 89 c5 eb bb 90 55 48 8d af 40 ff ff ff 53 48 8b 47 68 48 89 fb 48 83 f8 78 74 0e <48> 8b 40 c8 48 85 c0 74 05 48 89 ef ff d0 80 3d 35 81 b7 01 00 74 RSP: 0018:ffff95fec0d37db8 EFLAGS: 00010297 RAX: 0000000000000000 RBX: ffff8d70c0f1f0c0 RCX: 0000000000000004 RDX: ffff8d7115a03a00 RSI: 0000000000000206 RDI: ffff8d70c0f1f0c0 RBP: ffff8d70c0f1f000 R08: 0000000000000002 R09: 0000000000000502 R10: 0000000000000000 R11: 0000000000000006 R12: ffff8d70c0f1f0c0 R13: ffff8d70c0f1f140 R14: 00000000fee1dead R15: 0000000000000000 FS: 00007fd3089e0b80(0000) GS:ffff8d7237c00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: ffffffffffffffc8 CR3: 0000000155abb001 CR4: 00000000003706f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: device_shutdown+0x12e/0x180 kernel_kexec+0x52/0xb0 __do_sys_reboot+0x1c0/0x210 do_syscall_64+0x35/0x80 entry_SYSCALL_64_after_hwframe+0x44/0xae RIP: 0033:0x7fd308afd557 Code: 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 89 fa be 69 19 12 28 bf ad de e1 fe b8 a9 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 01 c3 48 8b 15 f1 a8 0c 00 f7 d8 64 89 02 b8 RSP: 002b:00007fff7d01e0a8 EFLAGS: 00000246 ORIG_RAX: 00000000000000a9 RAX: ffffffffffffffda RBX: 00005606db11d380 RCX: 00007fd308afd557 RDX: 0000000045584543 RSI: 0000000028121969 RDI: 00000000fee1dead RBP: 0000000000000000 R08: 0000000000000007 R09: 00007fd308bc8a60 R10: 0000000000000021 R11: 0000000000000246 R12: 0000000000000003 R13: 00007fff7d01e1f0 R14: 00005606db11d8c0 R15: 00000000ffffffff Modules linked in: CR2: ffffffffffffffc8 ---[ end trace 0cb0bc633a6fde3e ]--- Where: (gdb) l *(pci_device_shutdown+0x16) 0xffffffff8156abf6 is in pci_device_shutdown (drivers/pci/pci-driver.c:496). 491 struct pci_dev *pci_dev = to_pci_dev(dev); 492 struct pci_driver *drv = to_pci_driver(pci_dev->dev.driver); 493 494 pm_runtime_resume(dev); 495 496 if (drv && drv->shutdown) 497 drv->shutdown(pci_dev); 498 499 /* 500 * If this is a kexec reboot, turn off Bus Master bit on the ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v5 10/11] PCI: Replace pci_dev::driver usage by pci_dev::dev.driver 2021-09-29 8:52 [PATCH v5 00/11] PCI: Drop duplicated tracking of a pci_dev's bound driver Uwe Kleine-König 2021-09-29 8:53 ` [PATCH v5 05/11] powerpc/eeh: Don't use driver member of struct pci_dev and further cleanups Uwe Kleine-König 2021-09-29 8:53 ` [PATCH v5 07/11] PCI: Replace pci_dev::driver usage that gets the driver name Uwe Kleine-König @ 2021-09-29 8:53 ` Uwe Kleine-König 2021-09-29 13:15 ` Andrew Donnellan 2 siblings, 1 reply; 11+ messages in thread From: Uwe Kleine-König @ 2021-09-29 8:53 UTC (permalink / raw) To: Bjorn Helgaas Cc: Mark Rutland, Peter Zijlstra, H. Peter Anvin, Oliver O'Halloran, Jiri Olsa, Christoph Hellwig, Stefano Stabellini, Mathias Nyman, x86, Alexander Shishkin, Ingo Molnar, linux-pci, xen-devel, Juergen Gross, Andrew Donnellan, Arnd Bergmann, Konrad Rzeszutek Wilk, Arnaldo Carvalho de Melo, Borislav Petkov, Bjorn Helgaas, Namhyung Kim, Thomas Gleixner, Boris Ostrovsky, Greg Kroah-Hartman, linux-usb, linux-perf-users, kernel, Frederic Barrat, Paul Mackerras, linuxppc-dev struct pci_dev::driver contains (apart from a constant offset) the same data as struct pci_dev::dev->driver. Replace all remaining users of the former pointer by the latter to allow removing the former. Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> --- arch/powerpc/kernel/eeh_driver.c | 10 ++++----- arch/x86/events/intel/uncore.c | 2 +- arch/x86/kernel/probe_roms.c | 2 +- drivers/misc/cxl/guest.c | 24 ++++++++++++--------- drivers/misc/cxl/pci.c | 30 ++++++++++++++++---------- drivers/pci/iov.c | 25 ++++++++++++++-------- drivers/pci/pci-driver.c | 25 +++++++++++----------- drivers/pci/pci.c | 4 ++-- drivers/pci/pcie/err.c | 36 ++++++++++++++++++-------------- drivers/pci/xen-pcifront.c | 4 ++-- drivers/usb/host/xhci-pci.c | 2 +- 11 files changed, 93 insertions(+), 71 deletions(-) diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c index 3eff6a4888e7..350dab18e137 100644 --- a/arch/powerpc/kernel/eeh_driver.c +++ b/arch/powerpc/kernel/eeh_driver.c @@ -104,13 +104,13 @@ static bool eeh_edev_actionable(struct eeh_dev *edev) */ static inline struct pci_driver *eeh_pcid_get(struct pci_dev *pdev) { - if (!pdev || !pdev->driver) + if (!pdev || !pdev->dev.driver) return NULL; - if (!try_module_get(pdev->driver->driver.owner)) + if (!try_module_get(pdev->dev.driver->owner)) return NULL; - return pdev->driver; + return to_pci_driver(pdev->dev.driver); } /** @@ -122,10 +122,10 @@ static inline struct pci_driver *eeh_pcid_get(struct pci_dev *pdev) */ static inline void eeh_pcid_put(struct pci_dev *pdev) { - if (!pdev || !pdev->driver) + if (!pdev || !pdev->dev.driver) return; - module_put(pdev->driver->driver.owner); + module_put(pdev->dev.driver->owner); } /** diff --git a/arch/x86/events/intel/uncore.c b/arch/x86/events/intel/uncore.c index c72e368dd164..f1ba6ab2e97e 100644 --- a/arch/x86/events/intel/uncore.c +++ b/arch/x86/events/intel/uncore.c @@ -1187,7 +1187,7 @@ static int uncore_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id * PCI slot and func to indicate the uncore box. */ if (id->driver_data & ~0xffff) { - struct pci_driver *pci_drv = pdev->driver; + struct pci_driver *pci_drv = to_pci_driver(pdev->dev.driver); pmu = uncore_pci_find_dev_pmu(pdev, pci_drv->id_table); if (pmu == NULL) diff --git a/arch/x86/kernel/probe_roms.c b/arch/x86/kernel/probe_roms.c index 9e1def3744f2..36e84d904260 100644 --- a/arch/x86/kernel/probe_roms.c +++ b/arch/x86/kernel/probe_roms.c @@ -80,7 +80,7 @@ static struct resource video_rom_resource = { */ static bool match_id(struct pci_dev *pdev, unsigned short vendor, unsigned short device) { - struct pci_driver *drv = pdev->driver; + struct pci_driver *drv = to_pci_driver(pdev->dev.driver); const struct pci_device_id *id; if (pdev->vendor == vendor && pdev->device == device) diff --git a/drivers/misc/cxl/guest.c b/drivers/misc/cxl/guest.c index 186308f1f8eb..d997c9c3ebb5 100644 --- a/drivers/misc/cxl/guest.c +++ b/drivers/misc/cxl/guest.c @@ -25,28 +25,32 @@ static void pci_error_handlers(struct cxl_afu *afu, return; list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) { - if (!afu_dev->driver) + struct pci_driver *afu_drv; + + if (!afu_dev->dev.driver) continue; + afu_drv = to_pci_driver(afu_dev->dev.driver); + switch (bus_error_event) { case CXL_ERROR_DETECTED_EVENT: afu_dev->error_state = state; - if (afu_dev->driver->err_handler && - afu_dev->driver->err_handler->error_detected) - afu_dev->driver->err_handler->error_detected(afu_dev, state); + if (afu_drv->err_handler && + afu_drv->err_handler->error_detected) + afu_drv->err_handler->error_detected(afu_dev, state); break; case CXL_SLOT_RESET_EVENT: afu_dev->error_state = state; - if (afu_dev->driver->err_handler && - afu_dev->driver->err_handler->slot_reset) - afu_dev->driver->err_handler->slot_reset(afu_dev); + if (afu_drv->err_handler && + afu_drv->err_handler->slot_reset) + afu_drv->err_handler->slot_reset(afu_dev); break; case CXL_RESUME_EVENT: - if (afu_dev->driver->err_handler && - afu_dev->driver->err_handler->resume) - afu_dev->driver->err_handler->resume(afu_dev); + if (afu_drv->err_handler && + afu_drv->err_handler->resume) + afu_drv->err_handler->resume(afu_dev); break; } } diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c index 2ba899f5659f..7e7545d01e27 100644 --- a/drivers/misc/cxl/pci.c +++ b/drivers/misc/cxl/pci.c @@ -1805,14 +1805,16 @@ static pci_ers_result_t cxl_vphb_error_detected(struct cxl_afu *afu, return result; list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) { - if (!afu_dev->driver) + struct pci_driver *afu_drv; + if (!afu_dev->dev.driver) continue; + afu_drv = to_pci_driver(afu_dev->dev.driver); + afu_dev->error_state = state; - if (afu_dev->driver->err_handler) - afu_result = afu_dev->driver->err_handler->error_detected(afu_dev, - state); + if (afu_drv->err_handler) + afu_result = afu_drv->err_handler->error_detected(afu_dev, state); /* Disconnect trumps all, NONE trumps NEED_RESET */ if (afu_result == PCI_ERS_RESULT_DISCONNECT) result = PCI_ERS_RESULT_DISCONNECT; @@ -2003,6 +2005,8 @@ static pci_ers_result_t cxl_pci_slot_reset(struct pci_dev *pdev) continue; list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) { + struct pci_driver *afu_drv; + /* Reset the device context. * TODO: make this less disruptive */ @@ -2028,12 +2032,14 @@ static pci_ers_result_t cxl_pci_slot_reset(struct pci_dev *pdev) * shouldn't start new work until we call * their resume function. */ - if (!afu_dev->driver) + if (!afu_dev->dev.driver) continue; - if (afu_dev->driver->err_handler && - afu_dev->driver->err_handler->slot_reset) - afu_result = afu_dev->driver->err_handler->slot_reset(afu_dev); + afu_drv = to_pci_driver(afu_dev->dev.driver); + + if (afu_drv->err_handler && + afu_drv->err_handler->slot_reset) + afu_result = afu_drv->err_handler->slot_reset(afu_dev); if (afu_result == PCI_ERS_RESULT_DISCONNECT) result = PCI_ERS_RESULT_DISCONNECT; @@ -2074,9 +2080,11 @@ static void cxl_pci_resume(struct pci_dev *pdev) continue; list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) { - if (afu_dev->driver && afu_dev->driver->err_handler && - afu_dev->driver->err_handler->resume) - afu_dev->driver->err_handler->resume(afu_dev); + struct pci_driver *afu_drv; + if (afu_dev->dev.driver && + (afu_drv = to_pci_driver(afu_dev->dev.driver))->err_handler && + afu_drv->err_handler->resume) + afu_drv->err_handler->resume(afu_dev); } } spin_unlock(&adapter->afu_list_lock); diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c index dafdc652fcd0..f94660927544 100644 --- a/drivers/pci/iov.c +++ b/drivers/pci/iov.c @@ -164,13 +164,15 @@ static ssize_t sriov_vf_total_msix_show(struct device *dev, char *buf) { struct pci_dev *pdev = to_pci_dev(dev); + struct pci_driver *pdrv; u32 vf_total_msix = 0; device_lock(dev); - if (!pdev->driver || !pdev->driver->sriov_get_vf_total_msix) + pdrv = to_pci_driver(dev->driver); + if (!pdrv || !pdrv->sriov_get_vf_total_msix) goto unlock; - vf_total_msix = pdev->driver->sriov_get_vf_total_msix(pdev); + vf_total_msix = pdrv->sriov_get_vf_total_msix(pdev); unlock: device_unlock(dev); return sysfs_emit(buf, "%u\n", vf_total_msix); @@ -183,6 +185,7 @@ static ssize_t sriov_vf_msix_count_store(struct device *dev, { struct pci_dev *vf_dev = to_pci_dev(dev); struct pci_dev *pdev = pci_physfn(vf_dev); + struct pci_driver *pdrv; int val, ret; ret = kstrtoint(buf, 0, &val); @@ -193,13 +196,14 @@ static ssize_t sriov_vf_msix_count_store(struct device *dev, return -EINVAL; device_lock(&pdev->dev); - if (!pdev->driver || !pdev->driver->sriov_set_msix_vec_count) { + pdrv = to_pci_driver(pdev->dev.driver); + if (!pdrv || !pdrv->sriov_set_msix_vec_count) { ret = -EOPNOTSUPP; goto err_pdev; } device_lock(&vf_dev->dev); - if (vf_dev->driver) { + if (vf_dev->dev.driver) { /* * A driver is already attached to this VF and has configured * itself based on the current MSI-X vector count. Changing @@ -209,7 +213,7 @@ static ssize_t sriov_vf_msix_count_store(struct device *dev, goto err_dev; } - ret = pdev->driver->sriov_set_msix_vec_count(vf_dev, val); + ret = pdrv->sriov_set_msix_vec_count(vf_dev, val); err_dev: device_unlock(&vf_dev->dev); @@ -376,6 +380,7 @@ static ssize_t sriov_numvfs_store(struct device *dev, const char *buf, size_t count) { struct pci_dev *pdev = to_pci_dev(dev); + struct pci_driver *pdrv; int ret; u16 num_vfs; @@ -392,14 +397,16 @@ static ssize_t sriov_numvfs_store(struct device *dev, goto exit; /* is PF driver loaded */ - if (!pdev->driver) { + if (!pdev->dev.driver) { pci_info(pdev, "no driver bound to device; cannot configure SR-IOV\n"); ret = -ENOENT; goto exit; } + pdrv = to_pci_driver(pdev->dev.driver); + /* is PF driver loaded w/callback */ - if (!pdev->driver->sriov_configure) { + if (!pdrv->sriov_configure) { pci_info(pdev, "driver does not support SR-IOV configuration via sysfs\n"); ret = -ENOENT; goto exit; @@ -407,7 +414,7 @@ static ssize_t sriov_numvfs_store(struct device *dev, if (num_vfs == 0) { /* disable VFs */ - ret = pdev->driver->sriov_configure(pdev, 0); + ret = pdrv->sriov_configure(pdev, 0); goto exit; } @@ -419,7 +426,7 @@ static ssize_t sriov_numvfs_store(struct device *dev, goto exit; } - ret = pdev->driver->sriov_configure(pdev, num_vfs); + ret = pdrv->sriov_configure(pdev, num_vfs); if (ret < 0) goto exit; diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 50449ec622a3..4d20022b8631 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c @@ -457,7 +457,7 @@ static int pci_device_probe(struct device *dev) static void pci_device_remove(struct device *dev) { struct pci_dev *pci_dev = to_pci_dev(dev); - struct pci_driver *drv = pci_dev->driver; + struct pci_driver *drv = to_pci_driver(pci_dev->dev.driver); if (drv->remove) { pm_runtime_get_sync(dev); @@ -493,7 +493,7 @@ static void pci_device_remove(struct device *dev) static void pci_device_shutdown(struct device *dev) { struct pci_dev *pci_dev = to_pci_dev(dev); - struct pci_driver *drv = pci_dev->driver; + struct pci_driver *drv = to_pci_driver(pci_dev->dev.driver); pm_runtime_resume(dev); @@ -589,7 +589,7 @@ static int pci_pm_reenable_device(struct pci_dev *pci_dev) static int pci_legacy_suspend(struct device *dev, pm_message_t state) { struct pci_dev *pci_dev = to_pci_dev(dev); - struct pci_driver *drv = pci_dev->driver; + struct pci_driver *drv = to_pci_driver(dev->driver); if (drv && drv->suspend) { pci_power_t prev = pci_dev->current_state; @@ -630,7 +630,7 @@ static int pci_legacy_suspend_late(struct device *dev, pm_message_t state) static int pci_legacy_resume(struct device *dev) { struct pci_dev *pci_dev = to_pci_dev(dev); - struct pci_driver *drv = pci_dev->driver; + struct pci_driver *drv = to_pci_driver(pci_dev->dev.driver); pci_fixup_device(pci_fixup_resume, pci_dev); @@ -649,7 +649,7 @@ static void pci_pm_default_suspend(struct pci_dev *pci_dev) static bool pci_has_legacy_pm_support(struct pci_dev *pci_dev) { - struct pci_driver *drv = pci_dev->driver; + struct pci_driver *drv = to_pci_driver(pci_dev->dev.driver); bool ret = drv && (drv->suspend || drv->resume); /* @@ -1242,11 +1242,11 @@ static int pci_pm_runtime_suspend(struct device *dev) int error; /* - * If pci_dev->driver is not set (unbound), we leave the device in D0, + * If pci_dev->dev.driver is not set (unbound), we leave the device in D0, * but it may go to D3cold when the bridge above it runtime suspends. * Save its config space in case that happens. */ - if (!pci_dev->driver) { + if (!pci_dev->dev.driver) { pci_save_state(pci_dev); return 0; } @@ -1303,7 +1303,7 @@ static int pci_pm_runtime_resume(struct device *dev) */ pci_restore_standard_config(pci_dev); - if (!pci_dev->driver) + if (!dev->driver) return 0; pci_fixup_device(pci_fixup_resume_early, pci_dev); @@ -1322,14 +1322,13 @@ static int pci_pm_runtime_resume(struct device *dev) static int pci_pm_runtime_idle(struct device *dev) { - struct pci_dev *pci_dev = to_pci_dev(dev); const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; /* - * If pci_dev->driver is not set (unbound), the device should + * If dev->driver is not set (unbound), the device should * always remain in D0 regardless of the runtime PM status */ - if (!pci_dev->driver) + if (!dev->driver) return 0; if (!pm) @@ -1436,8 +1435,8 @@ static struct pci_driver pci_compat_driver = { */ struct pci_driver *pci_dev_driver(const struct pci_dev *dev) { - if (dev->driver) - return dev->driver; + if (dev->dev.driver) + return to_pci_driver(dev->dev.driver); else { int i; for (i = 0; i <= PCI_ROM_RESOURCE; i++) diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index ce2ab62b64cf..ccecf740de59 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -5089,7 +5089,7 @@ EXPORT_SYMBOL_GPL(pci_dev_unlock); static void pci_dev_save_and_disable(struct pci_dev *dev) { const struct pci_error_handlers *err_handler = - dev->driver ? dev->driver->err_handler : NULL; + dev->dev.driver ? to_pci_driver(dev->dev.driver)->err_handler : NULL; /* * dev->driver->err_handler->reset_prepare() is protected against @@ -5120,7 +5120,7 @@ static void pci_dev_save_and_disable(struct pci_dev *dev) static void pci_dev_restore(struct pci_dev *dev) { const struct pci_error_handlers *err_handler = - dev->driver ? dev->driver->err_handler : NULL; + dev->dev.driver ? to_pci_driver(dev->dev.driver)->err_handler : NULL; pci_restore_state(dev); diff --git a/drivers/pci/pcie/err.c b/drivers/pci/pcie/err.c index b576aa890c76..b314b54f7821 100644 --- a/drivers/pci/pcie/err.c +++ b/drivers/pci/pcie/err.c @@ -49,14 +49,15 @@ static int report_error_detected(struct pci_dev *dev, pci_channel_state_t state, enum pci_ers_result *result) { + struct pci_driver *pdrv; pci_ers_result_t vote; const struct pci_error_handlers *err_handler; device_lock(&dev->dev); if (!pci_dev_set_io_state(dev, state) || - !dev->driver || - !dev->driver->err_handler || - !dev->driver->err_handler->error_detected) { + !dev->dev.driver || + !(pdrv = to_pci_driver(dev->dev.driver))->err_handler || + !pdrv->err_handler->error_detected) { /* * If any device in the subtree does not have an error_detected * callback, PCI_ERS_RESULT_NO_AER_DRIVER prevents subsequent @@ -70,7 +71,7 @@ static int report_error_detected(struct pci_dev *dev, vote = PCI_ERS_RESULT_NONE; } } else { - err_handler = dev->driver->err_handler; + err_handler = pdrv->err_handler; vote = err_handler->error_detected(dev, state); } pci_uevent_ers(dev, vote); @@ -92,15 +93,16 @@ static int report_normal_detected(struct pci_dev *dev, void *data) static int report_mmio_enabled(struct pci_dev *dev, void *data) { pci_ers_result_t vote, *result = data; + struct pci_driver *pdrv; const struct pci_error_handlers *err_handler; device_lock(&dev->dev); - if (!dev->driver || - !dev->driver->err_handler || - !dev->driver->err_handler->mmio_enabled) + if (!dev->dev.driver || + !(pdrv = to_pci_driver(dev->dev.driver))->err_handler || + !pdrv->err_handler->mmio_enabled) goto out; - err_handler = dev->driver->err_handler; + err_handler = pdrv->err_handler; vote = err_handler->mmio_enabled(dev); *result = merge_result(*result, vote); out: @@ -112,14 +114,15 @@ static int report_slot_reset(struct pci_dev *dev, void *data) { pci_ers_result_t vote, *result = data; const struct pci_error_handlers *err_handler; + struct pci_driver *pdrv; device_lock(&dev->dev); - if (!dev->driver || - !dev->driver->err_handler || - !dev->driver->err_handler->slot_reset) + if (!dev->dev.driver || + !(pdrv = to_pci_driver(dev->dev.driver))->err_handler || + !pdrv->err_handler->slot_reset) goto out; - err_handler = dev->driver->err_handler; + err_handler = pdrv->err_handler; vote = err_handler->slot_reset(dev); *result = merge_result(*result, vote); out: @@ -130,15 +133,16 @@ static int report_slot_reset(struct pci_dev *dev, void *data) static int report_resume(struct pci_dev *dev, void *data) { const struct pci_error_handlers *err_handler; + struct pci_driver *pdrv; device_lock(&dev->dev); if (!pci_dev_set_io_state(dev, pci_channel_io_normal) || - !dev->driver || - !dev->driver->err_handler || - !dev->driver->err_handler->resume) + !dev->dev.driver || + !(pdrv = to_pci_driver(dev->dev.driver))->err_handler || + !pdrv->err_handler->resume) goto out; - err_handler = dev->driver->err_handler; + err_handler = pdrv->err_handler; err_handler->resume(dev); out: pci_uevent_ers(dev, PCI_ERS_RESULT_RECOVERED); diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c index f2d7f70a7a10..73831fb87a1e 100644 --- a/drivers/pci/xen-pcifront.c +++ b/drivers/pci/xen-pcifront.c @@ -601,12 +601,12 @@ static pci_ers_result_t pcifront_common_process(int cmd, result = PCI_ERS_RESULT_NONE; pcidev = pci_get_domain_bus_and_slot(domain, bus, devfn); - if (!pcidev || !pcidev->driver) { + if (!pcidev || !pcidev->dev.driver) { dev_err(&pdev->xdev->dev, "device or AER driver is NULL\n"); pci_dev_put(pcidev); return result; } - pdrv = pcidev->driver; + pdrv = to_pci_driver(pcidev->dev.driver); if (pdrv->err_handler && pdrv->err_handler->error_detected) { pci_dbg(pcidev, "trying to call AER service\n"); diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 2c9f25ca8edd..2f4729f4f1e0 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c @@ -103,7 +103,7 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) struct xhci_driver_data *driver_data; const struct pci_device_id *id; - id = pci_match_id(pdev->driver->id_table, pdev); + id = pci_match_id(to_pci_driver(pdev->dev.driver)->id_table, pdev); if (id && id->driver_data) { driver_data = (struct xhci_driver_data *)id->driver_data; -- 2.30.2 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v5 10/11] PCI: Replace pci_dev::driver usage by pci_dev::dev.driver 2021-09-29 8:53 ` [PATCH v5 10/11] PCI: Replace pci_dev::driver usage by pci_dev::dev.driver Uwe Kleine-König @ 2021-09-29 13:15 ` Andrew Donnellan 2021-09-29 13:43 ` Uwe Kleine-König 0 siblings, 1 reply; 11+ messages in thread From: Andrew Donnellan @ 2021-09-29 13:15 UTC (permalink / raw) To: Uwe Kleine-König, Bjorn Helgaas Cc: Mark Rutland, Peter Zijlstra, H. Peter Anvin, Oliver O'Halloran, Jiri Olsa, Christoph Hellwig, Stefano Stabellini, Mathias Nyman, x86, Alexander Shishkin, Ingo Molnar, linux-pci, xen-devel, Juergen Gross, Arnd Bergmann, Konrad Rzeszutek Wilk, Arnaldo Carvalho de Melo, Borislav Petkov, Bjorn Helgaas, Namhyung Kim, Thomas Gleixner, Boris Ostrovsky, Greg Kroah-Hartman, linux-usb, linux-perf-users, kernel, Frederic Barrat, Paul Mackerras, linuxppc-dev On 29/9/21 6:53 pm, Uwe Kleine-König wrote:> list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) { > - if (afu_dev->driver && afu_dev->driver->err_handler && > - afu_dev->driver->err_handler->resume) > - afu_dev->driver->err_handler->resume(afu_dev); > + struct pci_driver *afu_drv; > + if (afu_dev->dev.driver && > + (afu_drv = to_pci_driver(afu_dev->dev.driver))->err_handler && I'm not a huge fan of assignments in if statements and if you send a v6 I'd prefer you break it up. Apart from that everything in the powerpc and cxl sections looks good to me. -- Andrew Donnellan OzLabs, ADL Canberra ajd@linux.ibm.com IBM Australia Limited ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v5 10/11] PCI: Replace pci_dev::driver usage by pci_dev::dev.driver 2021-09-29 13:15 ` Andrew Donnellan @ 2021-09-29 13:43 ` Uwe Kleine-König 2021-09-29 15:44 ` Andrew Donnellan 0 siblings, 1 reply; 11+ messages in thread From: Uwe Kleine-König @ 2021-09-29 13:43 UTC (permalink / raw) To: Andrew Donnellan Cc: Mark Rutland, Peter Zijlstra, H. Peter Anvin, Oliver O'Halloran, Jiri Olsa, Christoph Hellwig, Stefano Stabellini, Arnd Bergmann, Boris Ostrovsky, x86, Alexander Shishkin, Ingo Molnar, Bjorn Helgaas, linux-pci, xen-devel, Mathias Nyman, Konrad Rzeszutek Wilk, Arnaldo Carvalho de Melo, Borislav Petkov, Bjorn Helgaas, Namhyung Kim, Thomas Gleixner, Juergen Gross, Greg Kroah-Hartman, linux-usb, linux-perf-users, kernel, Frederic Barrat, Paul Mackerras, linuxppc-dev [-- Attachment #1: Type: text/plain, Size: 1935 bytes --] On Wed, Sep 29, 2021 at 11:15:37PM +1000, Andrew Donnellan wrote: > On 29/9/21 6:53 pm, Uwe Kleine-König wrote:> > list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) { > > - if (afu_dev->driver && afu_dev->driver->err_handler && > > - afu_dev->driver->err_handler->resume) > > - afu_dev->driver->err_handler->resume(afu_dev); > > + struct pci_driver *afu_drv; > > + if (afu_dev->dev.driver && > > + (afu_drv = to_pci_driver(afu_dev->dev.driver))->err_handler && > > I'm not a huge fan of assignments in if statements and if you send a v6 I'd > prefer you break it up. I'm not a huge fan either, I used it to keep the control flow as is and without introducing several calls to to_pci_driver. The whole code looks as follows: list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) { struct pci_driver *afu_drv; if (afu_dev->dev.driver && (afu_drv = to_pci_driver(afu_dev->dev.driver))->err_handler && afu_drv->err_handler->resume) afu_drv->err_handler->resume(afu_dev); } Without assignment in the if it could look as follows: list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) { struct pci_driver *afu_drv; if (!afu_dev->dev.driver) continue; afu_drv = to_pci_driver(afu_dev->dev.driver)); if (afu_drv->err_handler && afu_drv->err_handler->resume) afu_drv->err_handler->resume(afu_dev); } Fine for me. (Sidenote: What happens if the device is unbound directly after the check for afu_dev->dev.driver? This is a problem the old code had, too (assuming it is a real problem, didn't check deeply).) > Apart from that everything in the powerpc and cxl sections looks good to me. Thanks for checking. Best regards Uwe -- Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | https://www.pengutronix.de/ | [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 484 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v5 10/11] PCI: Replace pci_dev::driver usage by pci_dev::dev.driver 2021-09-29 13:43 ` Uwe Kleine-König @ 2021-09-29 15:44 ` Andrew Donnellan 2021-09-30 13:48 ` Frederic Barrat 0 siblings, 1 reply; 11+ messages in thread From: Andrew Donnellan @ 2021-09-29 15:44 UTC (permalink / raw) To: Uwe Kleine-König Cc: Mark Rutland, Peter Zijlstra, H. Peter Anvin, Oliver O'Halloran, Jiri Olsa, Christoph Hellwig, Stefano Stabellini, Arnd Bergmann, Boris Ostrovsky, x86, Alexander Shishkin, Ingo Molnar, Bjorn Helgaas, linux-pci, xen-devel, Mathias Nyman, Konrad Rzeszutek Wilk, Arnaldo Carvalho de Melo, Borislav Petkov, Bjorn Helgaas, Namhyung Kim, Thomas Gleixner, Juergen Gross, Greg Kroah-Hartman, linux-usb, linux-perf-users, kernel, Frederic Barrat, Paul Mackerras, linuxppc-dev On 29/9/21 11:43 pm, Uwe Kleine-König wrote:> I'm not a huge fan either, I used it to keep the control flow as is and > without introducing several calls to to_pci_driver. > > The whole code looks as follows: > > list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) { > struct pci_driver *afu_drv; > if (afu_dev->dev.driver && > (afu_drv = to_pci_driver(afu_dev->dev.driver))->err_handler && > afu_drv->err_handler->resume) > afu_drv->err_handler->resume(afu_dev); > } > > Without assignment in the if it could look as follows: > > list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) { > struct pci_driver *afu_drv; > > if (!afu_dev->dev.driver) > continue; > > afu_drv = to_pci_driver(afu_dev->dev.driver)); > > if (afu_drv->err_handler && afu_drv->err_handler->resume) > afu_drv->err_handler->resume(afu_dev); > } > > Fine for me. This looks fine. As an aside while writing my email I discovered the existence of container_of_safe(), a version of container_of() that handles the null and err ptr cases... if to_pci_driver() used that, the null check in the caller could be moved until after the to_pci_driver() call which would be neater. But then, grep tells me that container_of_safe() is used precisely zero times in the entire tree. Interesting. > (Sidenote: What happens if the device is unbound directly after the > check for afu_dev->dev.driver? This is a problem the old code had, too > (assuming it is a real problem, didn't check deeply).) Looking at any of the cxl PCI error handling paths brings back nightmares from a few years ago... Fred: I wonder if we need to add a lock here? -- Andrew Donnellan OzLabs, ADL Canberra ajd@linux.ibm.com IBM Australia Limited ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v5 10/11] PCI: Replace pci_dev::driver usage by pci_dev::dev.driver 2021-09-29 15:44 ` Andrew Donnellan @ 2021-09-30 13:48 ` Frederic Barrat 0 siblings, 0 replies; 11+ messages in thread From: Frederic Barrat @ 2021-09-30 13:48 UTC (permalink / raw) To: Andrew Donnellan, Uwe Kleine-König Cc: Mark Rutland, Peter Zijlstra, H. Peter Anvin, Oliver O'Halloran, Jiri Olsa, Christoph Hellwig, Stefano Stabellini, Arnd Bergmann, Boris Ostrovsky, x86, Alexander Shishkin, Ingo Molnar, Bjorn Helgaas, linux-pci, xen-devel, Mathias Nyman, Konrad Rzeszutek Wilk, Arnaldo Carvalho de Melo, Borislav Petkov, Bjorn Helgaas, Namhyung Kim, Thomas Gleixner, Juergen Gross, Greg Kroah-Hartman, linux-usb, linux-perf-users, kernel, Paul Mackerras, linuxppc-dev On 29/09/2021 17:44, Andrew Donnellan wrote: > On 29/9/21 11:43 pm, Uwe Kleine-König wrote:> I'm not a huge fan either, > I used it to keep the control flow as is and >> without introducing several calls to to_pci_driver. >> >> The whole code looks as follows: >> >> list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) { >> struct pci_driver *afu_drv; >> if (afu_dev->dev.driver && >> (afu_drv = >> to_pci_driver(afu_dev->dev.driver))->err_handler && >> afu_drv->err_handler->resume) >> afu_drv->err_handler->resume(afu_dev); >> } >> >> Without assignment in the if it could look as follows: >> >> list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) { >> struct pci_driver *afu_drv; >> >> if (!afu_dev->dev.driver) >> continue; >> >> afu_drv = to_pci_driver(afu_dev->dev.driver)); >> >> if (afu_drv->err_handler && afu_drv->err_handler->resume) >> afu_drv->err_handler->resume(afu_dev); >> } >> >> Fine for me. > > This looks fine. > > As an aside while writing my email I discovered the existence of > container_of_safe(), a version of container_of() that handles the null > and err ptr cases... if to_pci_driver() used that, the null check in the > caller could be moved until after the to_pci_driver() call which would > be neater. > > But then, grep tells me that container_of_safe() is used precisely zero > times in the entire tree. Interesting. > >> (Sidenote: What happens if the device is unbound directly after the >> check for afu_dev->dev.driver? This is a problem the old code had, too >> (assuming it is a real problem, didn't check deeply).) > > Looking at any of the cxl PCI error handling paths brings back > nightmares from a few years ago... Fred: I wonder if we need to add a > lock here? Yes, it's indeed a potential issue, there's nothing to prevent the afu driver to unbind during that window. Sigh.. Fred ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2021-09-30 13:50 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-09-29 8:52 [PATCH v5 00/11] PCI: Drop duplicated tracking of a pci_dev's bound driver Uwe Kleine-König 2021-09-29 8:53 ` [PATCH v5 05/11] powerpc/eeh: Don't use driver member of struct pci_dev and further cleanups Uwe Kleine-König 2021-09-29 8:53 ` [PATCH v5 07/11] PCI: Replace pci_dev::driver usage that gets the driver name Uwe Kleine-König 2021-09-29 10:17 ` Simon Horman 2021-09-29 14:44 ` Ido Schimmel 2021-09-29 15:21 ` Ido Schimmel 2021-09-29 8:53 ` [PATCH v5 10/11] PCI: Replace pci_dev::driver usage by pci_dev::dev.driver Uwe Kleine-König 2021-09-29 13:15 ` Andrew Donnellan 2021-09-29 13:43 ` Uwe Kleine-König 2021-09-29 15:44 ` Andrew Donnellan 2021-09-30 13:48 ` Frederic Barrat
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).