* [PATCH 1/2] clk: qcom: fix error_path in gdsc_register
@ 2021-06-29 20:39 Dmitry Baryshkov
2021-06-29 20:39 ` [PATCH 2/2] clk: qcom: fix domains cleanup in gdsc_unregister Dmitry Baryshkov
2021-06-29 22:32 ` [PATCH 1/2] clk: qcom: fix error_path in gdsc_register Stephen Boyd
0 siblings, 2 replies; 4+ messages in thread
From: Dmitry Baryshkov @ 2021-06-29 20:39 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Stephen Boyd, Michael Turquette
Cc: linux-arm-msm, linux-clk
Properly handle and cleanup errors in gdsc_register() instead of just
returning an error and leaving some of resources registered/hanging in
the system.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/clk/qcom/gdsc.c | 32 ++++++++++++++++++++++++++++----
1 file changed, 28 insertions(+), 4 deletions(-)
diff --git a/drivers/clk/qcom/gdsc.c b/drivers/clk/qcom/gdsc.c
index 51ed640e527b..241186d9d08c 100644
--- a/drivers/clk/qcom/gdsc.c
+++ b/drivers/clk/qcom/gdsc.c
@@ -429,7 +429,7 @@ int gdsc_register(struct gdsc_desc *desc,
scs[i]->rcdev = rcdev;
ret = gdsc_init(scs[i]);
if (ret)
- return ret;
+ goto err_init;
data->domains[i] = &scs[i]->pd;
}
@@ -437,11 +437,35 @@ int gdsc_register(struct gdsc_desc *desc,
for (i = 0; i < num; i++) {
if (!scs[i])
continue;
- if (scs[i]->parent)
- pm_genpd_add_subdomain(scs[i]->parent, &scs[i]->pd);
+ if (scs[i]->parent) {
+ ret = pm_genpd_add_subdomain(scs[i]->parent, &scs[i]->pd);
+ if (ret)
+ goto err_subdomain;
+ }
}
- return of_genpd_add_provider_onecell(dev->of_node, data);
+ ret = of_genpd_add_provider_onecell(dev->of_node, data);
+ if (!ret)
+ return 0;
+
+err_subdomain:
+ i--;
+ for (; i >= 0; i--) {
+ if (!scs[i] || !scs[i]->parent)
+ continue;
+ pm_genpd_remove_subdomain(scs[i]->parent, &scs[i]->pd);
+ }
+ i = num;
+
+err_init:
+ i--;
+ for (; i >= 0; i--) {
+ if (!scs[i])
+ continue;
+ pm_genpd_remove(&scs[i]->pd);
+ }
+
+ return ret;
}
void gdsc_unregister(struct gdsc_desc *desc)
--
2.30.2
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/2] clk: qcom: fix domains cleanup in gdsc_unregister
2021-06-29 20:39 [PATCH 1/2] clk: qcom: fix error_path in gdsc_register Dmitry Baryshkov
@ 2021-06-29 20:39 ` Dmitry Baryshkov
2021-06-29 22:34 ` Stephen Boyd
2021-06-29 22:32 ` [PATCH 1/2] clk: qcom: fix error_path in gdsc_register Stephen Boyd
1 sibling, 1 reply; 4+ messages in thread
From: Dmitry Baryshkov @ 2021-06-29 20:39 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Stephen Boyd, Michael Turquette
Cc: linux-arm-msm, linux-clk
Properly remove registered genpds. Also remove the provider before
breaking parent/child links, so that the system is consistent at remove
time.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/clk/qcom/gdsc.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/drivers/clk/qcom/gdsc.c b/drivers/clk/qcom/gdsc.c
index 241186d9d08c..4b211dd1764d 100644
--- a/drivers/clk/qcom/gdsc.c
+++ b/drivers/clk/qcom/gdsc.c
@@ -475,6 +475,9 @@ void gdsc_unregister(struct gdsc_desc *desc)
struct gdsc **scs = desc->scs;
size_t num = desc->num;
+ /* Remove provider first */
+ of_genpd_del_provider(dev->of_node);
+
/* Remove subdomains */
for (i = 0; i < num; i++) {
if (!scs[i])
@@ -482,7 +485,13 @@ void gdsc_unregister(struct gdsc_desc *desc)
if (scs[i]->parent)
pm_genpd_remove_subdomain(scs[i]->parent, &scs[i]->pd);
}
- of_genpd_del_provider(dev->of_node);
+
+ /* Remove domains themselves */
+ for (i = 0; i < num; i++) {
+ if (!scs[i])
+ continue;
+ pm_genpd_remove(&scs[i]->pd);
+ }
}
/*
--
2.30.2
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 1/2] clk: qcom: fix error_path in gdsc_register
2021-06-29 20:39 [PATCH 1/2] clk: qcom: fix error_path in gdsc_register Dmitry Baryshkov
2021-06-29 20:39 ` [PATCH 2/2] clk: qcom: fix domains cleanup in gdsc_unregister Dmitry Baryshkov
@ 2021-06-29 22:32 ` Stephen Boyd
1 sibling, 0 replies; 4+ messages in thread
From: Stephen Boyd @ 2021-06-29 22:32 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Dmitry Baryshkov, Michael Turquette
Cc: linux-arm-msm, linux-clk
Quoting Dmitry Baryshkov (2021-06-29 13:39:18)
> Properly handle and cleanup errors in gdsc_register() instead of just
> returning an error and leaving some of resources registered/hanging in
> the system.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Any Fixes tag?
Also, please send multi-patch series with a cover letter and Cc Taniya
Das <tdas@codeaurora.org> on qcom clk patches.
-Stephen
> ---
> drivers/clk/qcom/gdsc.c | 32 ++++++++++++++++++++++++++++----
> 1 file changed, 28 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/clk/qcom/gdsc.c b/drivers/clk/qcom/gdsc.c
> index 51ed640e527b..241186d9d08c 100644
> --- a/drivers/clk/qcom/gdsc.c
> +++ b/drivers/clk/qcom/gdsc.c
> @@ -429,7 +429,7 @@ int gdsc_register(struct gdsc_desc *desc,
> scs[i]->rcdev = rcdev;
> ret = gdsc_init(scs[i]);
> if (ret)
> - return ret;
> + goto err_init;
> data->domains[i] = &scs[i]->pd;
> }
>
> @@ -437,11 +437,35 @@ int gdsc_register(struct gdsc_desc *desc,
> for (i = 0; i < num; i++) {
> if (!scs[i])
> continue;
> - if (scs[i]->parent)
> - pm_genpd_add_subdomain(scs[i]->parent, &scs[i]->pd);
> + if (scs[i]->parent) {
> + ret = pm_genpd_add_subdomain(scs[i]->parent, &scs[i]->pd);
> + if (ret)
> + goto err_subdomain;
> + }
> }
>
> - return of_genpd_add_provider_onecell(dev->of_node, data);
> + ret = of_genpd_add_provider_onecell(dev->of_node, data);
> + if (!ret)
> + return 0;
> +
> +err_subdomain:
> + i--;
> + for (; i >= 0; i--) {
> + if (!scs[i] || !scs[i]->parent)
> + continue;
> + pm_genpd_remove_subdomain(scs[i]->parent, &scs[i]->pd);
> + }
> + i = num;
> +
> +err_init:
> + i--;
> + for (; i >= 0; i--) {
> + if (!scs[i])
> + continue;
> + pm_genpd_remove(&scs[i]->pd);
> + }
> +
> + return ret;
> }
>
> void gdsc_unregister(struct gdsc_desc *desc)
> --
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 2/2] clk: qcom: fix domains cleanup in gdsc_unregister
2021-06-29 20:39 ` [PATCH 2/2] clk: qcom: fix domains cleanup in gdsc_unregister Dmitry Baryshkov
@ 2021-06-29 22:34 ` Stephen Boyd
0 siblings, 0 replies; 4+ messages in thread
From: Stephen Boyd @ 2021-06-29 22:34 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Dmitry Baryshkov, Michael Turquette
Cc: linux-arm-msm, linux-clk
Quoting Dmitry Baryshkov (2021-06-29 13:39:19)
> Properly remove registered genpds. Also remove the provider before
> breaking parent/child links, so that the system is consistent at remove
> time.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
> drivers/clk/qcom/gdsc.c | 11 ++++++++++-
> 1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/clk/qcom/gdsc.c b/drivers/clk/qcom/gdsc.c
> index 241186d9d08c..4b211dd1764d 100644
> --- a/drivers/clk/qcom/gdsc.c
> +++ b/drivers/clk/qcom/gdsc.c
> @@ -475,6 +475,9 @@ void gdsc_unregister(struct gdsc_desc *desc)
> struct gdsc **scs = desc->scs;
> size_t num = desc->num;
>
> + /* Remove provider first */
but why? A better comment would be
/*
* Remove provider first so that we can remove the genpds
* without worrying about consumers getting them during the
* removal process.
*/
> + of_genpd_del_provider(dev->of_node);
> +
> /* Remove subdomains */
> for (i = 0; i < num; i++) {
> if (!scs[i])
> @@ -482,7 +485,13 @@ void gdsc_unregister(struct gdsc_desc *desc)
> if (scs[i]->parent)
> pm_genpd_remove_subdomain(scs[i]->parent, &scs[i]->pd);
> }
> - of_genpd_del_provider(dev->of_node);
> +
> + /* Remove domains themselves */
> + for (i = 0; i < num; i++) {
> + if (!scs[i])
> + continue;
> + pm_genpd_remove(&scs[i]->pd);
> + }
> }
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2021-06-29 22:34 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-29 20:39 [PATCH 1/2] clk: qcom: fix error_path in gdsc_register Dmitry Baryshkov
2021-06-29 20:39 ` [PATCH 2/2] clk: qcom: fix domains cleanup in gdsc_unregister Dmitry Baryshkov
2021-06-29 22:34 ` Stephen Boyd
2021-06-29 22:32 ` [PATCH 1/2] clk: qcom: fix error_path in gdsc_register Stephen Boyd
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).