* [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
* [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 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 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 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
* 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).