Message ID | 20240813210342.1765944-1-vladimir.zapolskiy@linaro.org (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | [v2] media: qcom: camss: fix error path on configuration of power domains | expand |
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>
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);
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(-)