diff mbox series

media: venus: Fix probe error handling

Message ID 20250327125304.1090805-1-loic.poulain@oss.qualcomm.com (mailing list archive)
State New
Headers show
Series media: venus: Fix probe error handling | expand

Commit Message

Loic Poulain March 27, 2025, 12:53 p.m. UTC
Video device registering has been moved earlier in the probe function,
but the new order has not been propagated to error handling. This means
we can end with unreleased resources on error (e.g dangling video device
on missing firmware probe aborting).

Fixes: 08b1cf474b7f7 ("media: venus: core, venc, vdec: Fix probe dependency error")
Signed-off-by: Loic Poulain <loic.poulain@oss.qualcomm.com>
---
 drivers/media/platform/qcom/venus/core.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

Comments

Bryan O'Donoghue March 28, 2025, 4:04 p.m. UTC | #1
On 27/03/2025 12:53, Loic Poulain wrote:
> Video device registering has been moved earlier in the probe function,
> but the new order has not been propagated to error handling. This means
> we can end with unreleased resources on error (e.g dangling video device
> on missing firmware probe aborting).
> 
> Fixes: 08b1cf474b7f7 ("media: venus: core, venc, vdec: Fix probe dependency error")
> Signed-off-by: Loic Poulain <loic.poulain@oss.qualcomm.com>
> ---
>   drivers/media/platform/qcom/venus/core.c | 16 ++++++++--------
>   1 file changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
> index c4438e4b2d9b..103afda799ed 100644
> --- a/drivers/media/platform/qcom/venus/core.c
> +++ b/drivers/media/platform/qcom/venus/core.c
> @@ -438,7 +438,7 @@ static int venus_probe(struct platform_device *pdev)
> 
>   	ret = v4l2_device_register(dev, &core->v4l2_dev);
>   	if (ret)
> -		goto err_core_deinit;
> +		goto err_hfi_destroy;
> 
>   	platform_set_drvdata(pdev, core);
> 
> @@ -476,24 +476,24 @@ static int venus_probe(struct platform_device *pdev)
> 
>   	ret = venus_enumerate_codecs(core, VIDC_SESSION_TYPE_DEC);
>   	if (ret)
> -		goto err_venus_shutdown;
> +		goto err_core_deinit;
> 
>   	ret = venus_enumerate_codecs(core, VIDC_SESSION_TYPE_ENC);
>   	if (ret)
> -		goto err_venus_shutdown;
> +		goto err_core_deinit;
> 
>   	ret = pm_runtime_put_sync(dev);
>   	if (ret) {
>   		pm_runtime_get_noresume(dev);
> -		goto err_dev_unregister;
> +		goto err_core_deinit;
>   	}
> 
>   	venus_dbgfs_init(core);
> 
>   	return 0;
> 
> -err_dev_unregister:
> -	v4l2_device_unregister(&core->v4l2_dev);
> +err_core_deinit:
> +	hfi_core_deinit(core, false);
>   err_venus_shutdown:
>   	venus_shutdown(core);
>   err_firmware_deinit:
> @@ -506,9 +506,9 @@ static int venus_probe(struct platform_device *pdev)
>   	pm_runtime_put_noidle(dev);
>   	pm_runtime_disable(dev);
>   	pm_runtime_set_suspended(dev);
> +	v4l2_device_unregister(&core->v4l2_dev);
> +err_hfi_destroy:
>   	hfi_destroy(core);
> -err_core_deinit:
> -	hfi_core_deinit(core, false);
>   err_core_put:
>   	if (core->pm_ops->core_put)
>   		core->pm_ops->core_put(core);
> --
> 2.34.1
> 
> 
Reviewed-by: Bryan O'Donoghue <bod@kernel.org>
Bryan O'Donoghue March 28, 2025, 4:05 p.m. UTC | #2
On 27/03/2025 12:53, Loic Poulain wrote:
> Video device registering has been moved earlier in the probe function,
> but the new order has not been propagated to error handling. This means
> we can end with unreleased resources on error (e.g dangling video device
> on missing firmware probe aborting).
> 
> Fixes: 08b1cf474b7f7 ("media: venus: core, venc, vdec: Fix probe dependency error")
> Signed-off-by: Loic Poulain <loic.poulain@oss.qualcomm.com>
> ---
>   drivers/media/platform/qcom/venus/core.c | 16 ++++++++--------
>   1 file changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
> index c4438e4b2d9b..103afda799ed 100644
> --- a/drivers/media/platform/qcom/venus/core.c
> +++ b/drivers/media/platform/qcom/venus/core.c
> @@ -438,7 +438,7 @@ static int venus_probe(struct platform_device *pdev)
> 
>   	ret = v4l2_device_register(dev, &core->v4l2_dev);
>   	if (ret)
> -		goto err_core_deinit;
> +		goto err_hfi_destroy;
> 
>   	platform_set_drvdata(pdev, core);
> 
> @@ -476,24 +476,24 @@ static int venus_probe(struct platform_device *pdev)
> 
>   	ret = venus_enumerate_codecs(core, VIDC_SESSION_TYPE_DEC);
>   	if (ret)
> -		goto err_venus_shutdown;
> +		goto err_core_deinit;
> 
>   	ret = venus_enumerate_codecs(core, VIDC_SESSION_TYPE_ENC);
>   	if (ret)
> -		goto err_venus_shutdown;
> +		goto err_core_deinit;
> 
>   	ret = pm_runtime_put_sync(dev);
>   	if (ret) {
>   		pm_runtime_get_noresume(dev);
> -		goto err_dev_unregister;
> +		goto err_core_deinit;
>   	}
> 
>   	venus_dbgfs_init(core);
> 
>   	return 0;
> 
> -err_dev_unregister:
> -	v4l2_device_unregister(&core->v4l2_dev);
> +err_core_deinit:
> +	hfi_core_deinit(core, false);
>   err_venus_shutdown:
>   	venus_shutdown(core);
>   err_firmware_deinit:
> @@ -506,9 +506,9 @@ static int venus_probe(struct platform_device *pdev)
>   	pm_runtime_put_noidle(dev);
>   	pm_runtime_disable(dev);
>   	pm_runtime_set_suspended(dev);
> +	v4l2_device_unregister(&core->v4l2_dev);
> +err_hfi_destroy:
>   	hfi_destroy(core);
> -err_core_deinit:
> -	hfi_core_deinit(core, false);
>   err_core_put:
>   	if (core->pm_ops->core_put)
>   		core->pm_ops->core_put(core);
> --
> 2.34.1
> 
> 
Reviewed-by: Bryan O'Donoghue <bod@kernel.org>
diff mbox series

Patch

diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
index c4438e4b2d9b..103afda799ed 100644
--- a/drivers/media/platform/qcom/venus/core.c
+++ b/drivers/media/platform/qcom/venus/core.c
@@ -438,7 +438,7 @@  static int venus_probe(struct platform_device *pdev)
 
 	ret = v4l2_device_register(dev, &core->v4l2_dev);
 	if (ret)
-		goto err_core_deinit;
+		goto err_hfi_destroy;
 
 	platform_set_drvdata(pdev, core);
 
@@ -476,24 +476,24 @@  static int venus_probe(struct platform_device *pdev)
 
 	ret = venus_enumerate_codecs(core, VIDC_SESSION_TYPE_DEC);
 	if (ret)
-		goto err_venus_shutdown;
+		goto err_core_deinit;
 
 	ret = venus_enumerate_codecs(core, VIDC_SESSION_TYPE_ENC);
 	if (ret)
-		goto err_venus_shutdown;
+		goto err_core_deinit;
 
 	ret = pm_runtime_put_sync(dev);
 	if (ret) {
 		pm_runtime_get_noresume(dev);
-		goto err_dev_unregister;
+		goto err_core_deinit;
 	}
 
 	venus_dbgfs_init(core);
 
 	return 0;
 
-err_dev_unregister:
-	v4l2_device_unregister(&core->v4l2_dev);
+err_core_deinit:
+	hfi_core_deinit(core, false);
 err_venus_shutdown:
 	venus_shutdown(core);
 err_firmware_deinit:
@@ -506,9 +506,9 @@  static int venus_probe(struct platform_device *pdev)
 	pm_runtime_put_noidle(dev);
 	pm_runtime_disable(dev);
 	pm_runtime_set_suspended(dev);
+	v4l2_device_unregister(&core->v4l2_dev);
+err_hfi_destroy:
 	hfi_destroy(core);
-err_core_deinit:
-	hfi_core_deinit(core, false);
 err_core_put:
 	if (core->pm_ops->core_put)
 		core->pm_ops->core_put(core);