diff options
author | Paolo Abeni <pabeni@redhat.com> | 2023-11-30 13:04:15 +0100 |
---|---|---|
committer | Paolo Abeni <pabeni@redhat.com> | 2023-11-30 13:08:09 +0100 |
commit | 7e0222686316f5506e51182f02c1d83ecc34c471 (patch) | |
tree | 2ff9f07b626c77fb7295eba1975b4edefb58b906 /drivers/net/ethernet/ti/cpsw_new.c | |
parent | 04447185dadbb2dfab2b5a3c73c76cbaccd8fbe1 (diff) | |
parent | 7ec1bb2ce64ba9528b1f67bf489dd5f6147d1f64 (diff) |
Merge branch 'net-ethernet-convert-to-platform-remove-callback-returning-void'
Uwe Kleine-König says:
====================
net: ethernet: Convert to platform remove callback returning void
in (implicit) v1 of this series
(https://lore.kernel.org/netdev/20231117091655.872426-1-u.kleine-koenig@pengutronix.de)
I tried to address the resource leaks in the three cpsw drivers. However
this is hard to get right without being able to test the changes. So
here comes a series that just converts all drivers below
drivers/net/ethernet to use .remove_new() and adds a comment about the
potential leaks for someone else to fix the problem.
See commit 5c5a7680e67b ("platform: Provide a remove callback that
returns no value") for an extended explanation and the eventual goal.
The TL;DR; is to prevent bugs like the three noticed here.
Note this series results in no change of behaviour apart from improving
the error message for the three cpsw drivers from
remove callback returned a non-zero value. This will be ignored.
to
Failed to resume device (-ESOMETHING)
====================
Link: https://lore.kernel.org/r/20231128173823.867512-1-u.kleine-koenig@pengutronix.de
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Diffstat (limited to 'drivers/net/ethernet/ti/cpsw_new.c')
-rw-r--r-- | drivers/net/ethernet/ti/cpsw_new.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/drivers/net/ethernet/ti/cpsw_new.c b/drivers/net/ethernet/ti/cpsw_new.c index 0e4f526b1753..498c50c6d1a7 100644 --- a/drivers/net/ethernet/ti/cpsw_new.c +++ b/drivers/net/ethernet/ti/cpsw_new.c @@ -2037,14 +2037,20 @@ clean_dt_ret: return ret; } -static int cpsw_remove(struct platform_device *pdev) +static void cpsw_remove(struct platform_device *pdev) { struct cpsw_common *cpsw = platform_get_drvdata(pdev); int ret; ret = pm_runtime_resume_and_get(&pdev->dev); - if (ret < 0) - return ret; + if (ret < 0) { + /* Note, if this error path is taken, we're leaking some + * resources. + */ + dev_err(&pdev->dev, "Failed to resume device (%pe)\n", + ERR_PTR(ret)); + return; + } cpsw_unregister_notifiers(cpsw); cpsw_unregister_devlink(cpsw); @@ -2055,7 +2061,6 @@ static int cpsw_remove(struct platform_device *pdev) cpsw_remove_dt(cpsw); pm_runtime_put_sync(&pdev->dev); pm_runtime_disable(&pdev->dev); - return 0; } static int __maybe_unused cpsw_suspend(struct device *dev) @@ -2116,7 +2121,7 @@ static struct platform_driver cpsw_driver = { .of_match_table = cpsw_of_mtable, }, .probe = cpsw_probe, - .remove = cpsw_remove, + .remove_new = cpsw_remove, }; module_platform_driver(cpsw_driver); |