mbox series

[00/18] remoteproc: Convert to platform remove callback returning void

Message ID 20230504194453.1150368-1-u.kleine-koenig@pengutronix.de
Headers show
Series remoteproc: Convert to platform remove callback returning void | expand

Message

Uwe Kleine-König May 4, 2023, 7:44 p.m. UTC
Hello,

this patch series adapts most platform drivers below drivers/remoteproc
to use the .remove_new() callback. Compared to the traditional .remove()
callback .remove_new() returns no value. This is a good thing because
the driver core doesn't (and cannot) cope for errors during remove. The
only effect of a non-zero return value in .remove() is that the driver
core emits a warning. The device is removed anyhow and an early return
from .remove() usually yields a resource leak. One driver suffering from
this problem (s3c2410) is fixed by the first patch.

By changing the remove callback to return void driver authors cannot
reasonably (but wrongly) assume any more that there happens some kind of
cleanup later.

There is one driver (i.e. ti_k3_dsp_remoteproc.c) that might return an
error code in .remove(). I didn't look in detail into this driver, but
if that error happens, we have exactly the bad situation described
above. (Note that kproc->mem and the register mapping goes away.)

Best regards
Uwe

Uwe Kleine-König (18):
  remoteproc: da8xx: Convert to platform remove callback returning void
  remoteproc: imx_dsp: Convert to platform remove callback returning
    void
  remoteproc: imx: Convert to platform remove callback returning void
  remoteproc: keystone: Convert to platform remove callback returning
    void
  remoteproc: meson_mx_ao_arc: Convert to platform remove callback
    returning void
  remoteproc: mtk_scp: Convert to platform remove callback returning
    void
  remoteproc: omap: Convert to platform remove callback returning void
  remoteproc: pru: Convert to platform remove callback returning void
  remoteproc: qcom_q6v5_adsp: Convert to platform remove callback
    returning void
  remoteproc: qcom_q6v5_mss: Convert to platform remove callback
    returning void
  remoteproc: qcom_q6v5_pas: Convert to platform remove callback
    returning void
  remoteproc: qcom_q6v5_wcss: Convert to platform remove callback
    returning void
  remoteproc: qcom_wcnss: Convert to platform remove callback returning
    void
  remoteproc: rcar: Convert to platform remove callback returning void
  remoteproc: virtio: Convert to platform remove callback returning void
  remoteproc: st: Convert to platform remove callback returning void
  remoteproc: stm32: Convert to platform remove callback returning void
  remoteproc: wkup_m3: Convert to platform remove callback returning
    void

 drivers/remoteproc/da8xx_remoteproc.c    | 6 ++----
 drivers/remoteproc/imx_dsp_rproc.c       | 6 ++----
 drivers/remoteproc/imx_rproc.c           | 6 ++----
 drivers/remoteproc/keystone_remoteproc.c | 6 ++----
 drivers/remoteproc/meson_mx_ao_arc.c     | 6 ++----
 drivers/remoteproc/mtk_scp.c             | 6 ++----
 drivers/remoteproc/omap_remoteproc.c     | 6 ++----
 drivers/remoteproc/pru_rproc.c           | 6 ++----
 drivers/remoteproc/qcom_q6v5_adsp.c      | 6 ++----
 drivers/remoteproc/qcom_q6v5_mss.c       | 6 ++----
 drivers/remoteproc/qcom_q6v5_pas.c       | 6 ++----
 drivers/remoteproc/qcom_q6v5_wcss.c      | 6 ++----
 drivers/remoteproc/qcom_wcnss.c          | 6 ++----
 drivers/remoteproc/rcar_rproc.c          | 6 ++----
 drivers/remoteproc/remoteproc_virtio.c   | 6 ++----
 drivers/remoteproc/st_remoteproc.c       | 6 ++----
 drivers/remoteproc/stm32_rproc.c         | 6 ++----
 drivers/remoteproc/wkup_m3_rproc.c       | 6 ++----
 18 files changed, 36 insertions(+), 72 deletions(-)


base-commit: 1a5304fecee523060f26e2778d9d8e33c0562df3

Comments

Caleb Connolly May 5, 2023, 3 a.m. UTC | #1
On 04/05/2023 20:44, Uwe Kleine-König wrote:
> The .remove() callback for a platform driver returns an int which makes
> many driver authors wrongly assume it's possible to do error handling by
> returning an error code. However the value returned is (mostly) ignored
> and this typically results in resource leaks. To improve here there is a
> quest to make the remove callback return void. In the first step of this
> quest all drivers are converted to .remove_new() which already returns
> void.
> 
> Trivially convert this driver from always returning zero in the remove
> callback to the void returning variant.
> 
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>

Reviewed-by: Caleb Connolly <caleb.connolly@linaro.org>
> ---
>  drivers/remoteproc/qcom_q6v5_mss.c | 6 ++----
>  1 file changed, 2 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/remoteproc/qcom_q6v5_mss.c b/drivers/remoteproc/qcom_q6v5_mss.c
> index 8e15e4f85de1..70bffc9f33f6 100644
> --- a/drivers/remoteproc/qcom_q6v5_mss.c
> +++ b/drivers/remoteproc/qcom_q6v5_mss.c
> @@ -2110,7 +2110,7 @@ static int q6v5_probe(struct platform_device *pdev)
>  	return ret;
>  }
>  
> -static int q6v5_remove(struct platform_device *pdev)
> +static void q6v5_remove(struct platform_device *pdev)
>  {
>  	struct q6v5 *qproc = platform_get_drvdata(pdev);
>  	struct rproc *rproc = qproc->rproc;
> @@ -2128,8 +2128,6 @@ static int q6v5_remove(struct platform_device *pdev)
>  	q6v5_pds_detach(qproc, qproc->proxy_pds, qproc->proxy_pd_count);
>  
>  	rproc_free(rproc);
> -
> -	return 0;
>  }
>  
>  static const struct rproc_hexagon_res sc7180_mss = {
> @@ -2482,7 +2480,7 @@ MODULE_DEVICE_TABLE(of, q6v5_of_match);
>  
>  static struct platform_driver q6v5_driver = {
>  	.probe = q6v5_probe,
> -	.remove = q6v5_remove,
> +	.remove_new = q6v5_remove,
>  	.driver = {
>  		.name = "qcom-q6v5-mss",
>  		.of_match_table = q6v5_of_match,
Caleb Connolly May 5, 2023, 3:01 a.m. UTC | #2
On 04/05/2023 20:44, Uwe Kleine-König wrote:
> The .remove() callback for a platform driver returns an int which makes
> many driver authors wrongly assume it's possible to do error handling by
> returning an error code. However the value returned is (mostly) ignored
> and this typically results in resource leaks. To improve here there is a
> quest to make the remove callback return void. In the first step of this
> quest all drivers are converted to .remove_new() which already returns
> void.
> 
> Trivially convert this driver from always returning zero in the remove
> callback to the void returning variant.
> 
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>

Reviewed-by: Caleb Connolly <caleb.connolly@linaro.org>
> ---
>  drivers/remoteproc/qcom_q6v5_pas.c | 6 ++----
>  1 file changed, 2 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/remoteproc/qcom_q6v5_pas.c b/drivers/remoteproc/qcom_q6v5_pas.c
> index e34d82b18a67..ca0155f41dac 100644
> --- a/drivers/remoteproc/qcom_q6v5_pas.c
> +++ b/drivers/remoteproc/qcom_q6v5_pas.c
> @@ -754,7 +754,7 @@ static int adsp_probe(struct platform_device *pdev)
>  	return ret;
>  }
>  
> -static int adsp_remove(struct platform_device *pdev)
> +static void adsp_remove(struct platform_device *pdev)
>  {
>  	struct qcom_adsp *adsp = platform_get_drvdata(pdev);
>  
> @@ -769,8 +769,6 @@ static int adsp_remove(struct platform_device *pdev)
>  	adsp_pds_detach(adsp, adsp->proxy_pds, adsp->proxy_pd_count);
>  	device_init_wakeup(adsp->dev, false);
>  	rproc_free(adsp->rproc);
> -
> -	return 0;
>  }
>  
>  static const struct adsp_data adsp_resource_init = {
> @@ -1232,7 +1230,7 @@ MODULE_DEVICE_TABLE(of, adsp_of_match);
>  
>  static struct platform_driver adsp_driver = {
>  	.probe = adsp_probe,
> -	.remove = adsp_remove,
> +	.remove_new = adsp_remove,
>  	.driver = {
>  		.name = "qcom_q6v5_pas",
>  		.of_match_table = adsp_of_match,
Caleb Connolly May 5, 2023, 3:01 a.m. UTC | #3
On 04/05/2023 20:44, Uwe Kleine-König wrote:
> The .remove() callback for a platform driver returns an int which makes
> many driver authors wrongly assume it's possible to do error handling by
> returning an error code. However the value returned is (mostly) ignored
> and this typically results in resource leaks. To improve here there is a
> quest to make the remove callback return void. In the first step of this
> quest all drivers are converted to .remove_new() which already returns
> void.
> 
> Trivially convert this driver from always returning zero in the remove
> callback to the void returning variant.
> 
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>

Reviewed-by: Caleb Connolly <caleb.connolly@linaro.org>
> ---
>  drivers/remoteproc/qcom_q6v5_wcss.c | 6 ++----
>  1 file changed, 2 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/remoteproc/qcom_q6v5_wcss.c b/drivers/remoteproc/qcom_q6v5_wcss.c
> index ba24d745b2d6..b437044aa126 100644
> --- a/drivers/remoteproc/qcom_q6v5_wcss.c
> +++ b/drivers/remoteproc/qcom_q6v5_wcss.c
> @@ -1074,7 +1074,7 @@ static int q6v5_wcss_probe(struct platform_device *pdev)
>  	return ret;
>  }
>  
> -static int q6v5_wcss_remove(struct platform_device *pdev)
> +static void q6v5_wcss_remove(struct platform_device *pdev)
>  {
>  	struct rproc *rproc = platform_get_drvdata(pdev);
>  	struct q6v5_wcss *wcss = rproc->priv;
> @@ -1082,8 +1082,6 @@ static int q6v5_wcss_remove(struct platform_device *pdev)
>  	qcom_q6v5_deinit(&wcss->q6v5);
>  	rproc_del(rproc);
>  	rproc_free(rproc);
> -
> -	return 0;
>  }
>  
>  static const struct wcss_data wcss_ipq8074_res_init = {
> @@ -1117,7 +1115,7 @@ MODULE_DEVICE_TABLE(of, q6v5_wcss_of_match);
>  
>  static struct platform_driver q6v5_wcss_driver = {
>  	.probe = q6v5_wcss_probe,
> -	.remove = q6v5_wcss_remove,
> +	.remove_new = q6v5_wcss_remove,
>  	.driver = {
>  		.name = "qcom-q6v5-wcss-pil",
>  		.of_match_table = q6v5_wcss_of_match,