[Intel-wired-lan] [PATCH iwl-net] ice: stop calling pci_disable_device() as we use pcim
Philipp Stanner
pstanner at redhat.com
Thu Aug 29 07:11:40 UTC 2024
Hi,
On Wed, 2024-08-28 at 15:03 +0200, Przemek Kitszel wrote:
> Our driver uses devres to manage resources, in particular we call
> pcim_enable_device(), which recently has registered
> pcim_disable_device()
> as device remove action
That's not the exact cause, actually.
The ultimate call to pci_disable_device() (not pcim_) through callbacks
set up by pcim_enable_device() has always been there. It's not me
adding that which caused the warning. What caused it is that I removed
the enabled-check from pcim_disable_device():
f748a07a0b64:
-static void pcim_release(struct device *gendev, void *res)
+static void pcim_disable_device(void *pdev_raw)
{
- struct pci_dev *dev = to_pci_dev(gendev);
-
- if (pci_is_enabled(dev) && !dev->pinned)
- pci_disable_device(dev);
-}
-
-static struct pci_devres *get_pci_dr(struct pci_dev *pdev)
-{
- struct pci_devres *dr, *new_dr;
-
- dr = devres_find(&pdev->dev, pcim_release, NULL, NULL);
- if (dr)
- return dr;
+ struct pci_dev *pdev = pdev_raw;
- new_dr = devres_alloc(pcim_release, sizeof(*new_dr),
GFP_KERNEL);
- if (!new_dr)
- return NULL;
- return devres_get(&pdev->dev, new_dr, NULL, NULL);
+ if (!pdev->pinned)
+ pci_disable_device(pdev);
}
Theoretically, we could add
if (pci_is_enabled(...
back, but I think the far cleaner solution is to clean up the drivers
as you do here if that warning occurs. Faults should not be caused by
this, just warnings, if I read the code correctly. Please correct me if
not.
> (see cited "Fixes" commit). Since that, unloading
> the driver yields following warn+splat:
>
> [70633.628490] ice 0000:af:00.7: disabling already-disabled device
> [70633.628512] WARNING: CPU: 52 PID: 33890 at drivers/pci/pci.c:2250
> pci_disable_device+0xf4/0x100
> ...
> [70633.628744] ? pci_disable_device+0xf4/0x100
> [70633.628752] release_nodes+0x4a/0x70
> [70633.628759] devres_release_all+0x8b/0xc0
> [70633.628768] device_unbind_cleanup+0xe/0x70
> [70633.628774] device_release_driver_internal+0x208/0x250
> [70633.628781] driver_detach+0x47/0x90
> [70633.628786] bus_remove_driver+0x80/0x100
> [70633.628791] pci_unregister_driver+0x2a/0xb0
> [70633.628799] ice_module_exit+0x11/0x3a [ice]
>
> Note that this is the only Intel ethernet driver that needs such fix.
>
> CC: Philipp Stanner <pstanner at redhat.com>
> Fixes: f748a07a0b64 ("PCI: Remove legacy pcim_release()")
> Reviewed-by: Larysa Zaremba <larysa.zaremba at intel.com>
> Signed-off-by: Przemek Kitszel <przemyslaw.kitszel at intel.com>
Reviewed-by: Philipp Stanner <pstanner at redhat.com>
with or without the above suggestion for the commit message.
Thanks for solving this!
Regards,
P.
> ---
> drivers/net/ethernet/intel/ice/ice_main.c | 2 --
> 1 file changed, 2 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/ice/ice_main.c
> b/drivers/net/ethernet/intel/ice/ice_main.c
> index 6f97ed471fe9..18e4950316f1 100644
> --- a/drivers/net/ethernet/intel/ice/ice_main.c
> +++ b/drivers/net/ethernet/intel/ice/ice_main.c
> @@ -5350,7 +5350,6 @@ ice_probe(struct pci_dev *pdev, const struct
> pci_device_id __always_unused *ent)
> ice_deinit(pf);
> err_init:
> ice_adapter_put(pdev);
> - pci_disable_device(pdev);
> return err;
> }
>
> @@ -5457,7 +5456,6 @@ static void ice_remove(struct pci_dev *pdev)
> ice_set_wake(pf);
>
> ice_adapter_put(pdev);
> - pci_disable_device(pdev);
> }
>
> /**
>
> base-commit: 4186c8d9e6af57bab0687b299df10ebd47534a0a
More information about the Intel-wired-lan
mailing list