[v2] media: qcom: camss: fix error path on configuration of power domains

Message ID 20240813210342.1765944-1-vladimir.zapolskiy@linaro.org (mailing list archive)
State New
Headers
Series [v2] media: qcom: camss: fix error path on configuration of power domains |

Commit Message

Vladimir Zapolskiy Aug. 13, 2024, 9:03 p.m. UTC
  There is a chance to meet runtime issues during configuration of CAMSS
power domains, because on the error path dev_pm_domain_detach() is
unexpectedly called with NULL or error pointer.

One of the simplest ways to reproduce the problem is to probe CAMSS
driver before registration of CAMSS power domains, for instance if
a platform CAMCC driver is simply not built.

Warning backtrace example:

    Unable to handle kernel NULL pointer dereference at virtual address 00000000000001a2

    <snip>

    pc : dev_pm_domain_detach+0x8/0x48
    lr : camss_probe+0x374/0x9c0

    <snip>

    Call trace:
     dev_pm_domain_detach+0x8/0x48
     platform_probe+0x70/0xf0
     really_probe+0xc4/0x2a8
     __driver_probe_device+0x80/0x140
     driver_probe_device+0x48/0x170
     __device_attach_driver+0xc0/0x148
     bus_for_each_drv+0x88/0xf0
     __device_attach+0xb0/0x1c0
     device_initial_probe+0x1c/0x30
     bus_probe_device+0xb4/0xc0
     deferred_probe_work_func+0x90/0xd0
     process_one_work+0x164/0x3e0
     worker_thread+0x310/0x420
     kthread+0x120/0x130
     ret_from_fork+0x10/0x20

Fixes: 23aa4f0cd327 ("media: qcom: camss: Move VFE power-domain specifics into vfe.c")
Signed-off-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
---
The first version of the patch and discussion is found over here:

  https://lore.kernel.org/all/20240806221204.1560258-1-vladimir.zapolskiy@linaro.org/

Changes from v1 to v2:
* added an encountered runtime warning to the commit message per ask from Bryan.

I tested this fix in both cases of set and unset "power-domain-names"
property in camss device tree node, and I didn't find any negative side
effects of the fix.

 drivers/media/platform/qcom/camss/camss.c | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)
  

Comments

Bryan O'Donoghue Aug. 14, 2024, 8:42 a.m. UTC | #1
On 13/08/2024 22:03, Vladimir Zapolskiy wrote:
> There is a chance to meet runtime issues during configuration of CAMSS
> power domains, because on the error path dev_pm_domain_detach() is
> unexpectedly called with NULL or error pointer.
> 
> One of the simplest ways to reproduce the problem is to probe CAMSS
> driver before registration of CAMSS power domains, for instance if
> a platform CAMCC driver is simply not built.
> 
> Warning backtrace example:
> 
>      Unable to handle kernel NULL pointer dereference at virtual address 00000000000001a2
> 
>      <snip>
> 
>      pc : dev_pm_domain_detach+0x8/0x48
>      lr : camss_probe+0x374/0x9c0
> 
>      <snip>
> 
>      Call trace:
>       dev_pm_domain_detach+0x8/0x48
>       platform_probe+0x70/0xf0
>       really_probe+0xc4/0x2a8
>       __driver_probe_device+0x80/0x140
>       driver_probe_device+0x48/0x170
>       __device_attach_driver+0xc0/0x148
>       bus_for_each_drv+0x88/0xf0
>       __device_attach+0xb0/0x1c0
>       device_initial_probe+0x1c/0x30
>       bus_probe_device+0xb4/0xc0
>       deferred_probe_work_func+0x90/0xd0
>       process_one_work+0x164/0x3e0
>       worker_thread+0x310/0x420
>       kthread+0x120/0x130
>       ret_from_fork+0x10/0x20
> 
> Fixes: 23aa4f0cd327 ("media: qcom: camss: Move VFE power-domain specifics into vfe.c")
> Signed-off-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
> ---
> The first version of the patch and discussion is found over here:
> 
>    https://lore.kernel.org/all/20240806221204.1560258-1-vladimir.zapolskiy@linaro.org/
> 
> Changes from v1 to v2:
> * added an encountered runtime warning to the commit message per ask from Bryan.
> 
> I tested this fix in both cases of set and unset "power-domain-names"
> property in camss device tree node, and I didn't find any negative side
> effects of the fix.
> 
>   drivers/media/platform/qcom/camss/camss.c | 19 ++++++++-----------
>   1 file changed, 8 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/media/platform/qcom/camss/camss.c b/drivers/media/platform/qcom/camss/camss.c
> index 51b1d3550421..aa894be1461d 100644
> --- a/drivers/media/platform/qcom/camss/camss.c
> +++ b/drivers/media/platform/qcom/camss/camss.c

+ stable@vger.kernel.org

Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
  

Patch

diff --git a/drivers/media/platform/qcom/camss/camss.c b/drivers/media/platform/qcom/camss/camss.c
index 51b1d3550421..aa894be1461d 100644
--- a/drivers/media/platform/qcom/camss/camss.c
+++ b/drivers/media/platform/qcom/camss/camss.c
@@ -2130,10 +2130,8 @@  static int camss_configure_pd(struct camss *camss)
 	if (camss->res->pd_name) {
 		camss->genpd = dev_pm_domain_attach_by_name(camss->dev,
 							    camss->res->pd_name);
-		if (IS_ERR(camss->genpd)) {
-			ret = PTR_ERR(camss->genpd);
-			goto fail_pm;
-		}
+		if (IS_ERR(camss->genpd))
+			return PTR_ERR(camss->genpd);
 	}
 
 	if (!camss->genpd) {
@@ -2143,14 +2141,13 @@  static int camss_configure_pd(struct camss *camss)
 		 */
 		camss->genpd = dev_pm_domain_attach_by_id(camss->dev,
 							  camss->genpd_num - 1);
+		if (IS_ERR(camss->genpd))
+			return PTR_ERR(camss->genpd);
 	}
-	if (IS_ERR_OR_NULL(camss->genpd)) {
-		if (!camss->genpd)
-			ret = -ENODEV;
-		else
-			ret = PTR_ERR(camss->genpd);
-		goto fail_pm;
-	}
+
+	if (!camss->genpd)
+		return -ENODEV;
+
 	camss->genpd_link = device_link_add(camss->dev, camss->genpd,
 					    DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME |
 					    DL_FLAG_RPM_ACTIVE);