From: "dbasehore ." <dbasehore@chromium.org>
To: linux-kernel <linux-kernel@vger.kernel.org>
Cc: linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-rockchip@lists.infradead.org, linux-doc@vger.kernel.org,
sboyd@kernel.org, "Michael Turquette" <mturquette@baylibre.com>,
"Heiko Stübner" <heiko@sntech.de>,
aisheng.dong@nxp.com, mchehab+samsung@kernel.org,
"Jonathan Corbet" <corbet@lwn.net>
Subject: Re: [PATCH 2/6] clk: fix clk_calc_subtree compute duplications
Date: Wed, 31 Oct 2018 19:58:31 -0700 [thread overview]
Message-ID: <CAGAzgsp-tuSAThRGPtGM98opK0pJ5OfmxB9tx+9VBuxT6rz3cA@mail.gmail.com> (raw)
In-Reply-To: <20181024013132.115907-3-dbasehore@chromium.org>
On Tue, Oct 23, 2018 at 6:31 PM Derek Basehore <dbasehore@chromium.org> wrote:
>
> clk_calc_subtree was called at every step up the clk tree in
> clk_calc_new_rates. Since it recursively calls itself for its
> children, this means it would be called once on each clk for each
> step above the top clk is.
>
> This fixes this by breaking the subtree calculation into two parts.
> The first part recalcs the rate for each child of the parent clk in
> clk_calc_new_rates. This part is not recursive itself. The second part
> recursively calls a new clk_calc_subtree on the clk_core that was
> passed into clk_set_rate.
>
> Signed-off-by: Derek Basehore <dbasehore@chromium.org>
> ---
> drivers/clk/clk.c | 30 ++++++++++++++++++++----------
> 1 file changed, 20 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
> index 95d818f5edb2..61de8ad3e4cf 100644
> --- a/drivers/clk/clk.c
> +++ b/drivers/clk/clk.c
> @@ -1717,11 +1717,19 @@ static int __clk_speculate_rates(struct clk_core *core,
> return ret;
> }
>
> -static void clk_calc_subtree(struct clk_core *core, unsigned long new_rate,
> - struct clk_core *new_parent, u8 p_index)
> +static void clk_calc_subtree(struct clk_core *core)
> {
> struct clk_core *child;
>
> + hlist_for_each_entry(child, &core->children, child_node) {
> + child->new_rate = clk_recalc(child, core->new_rate);
> + clk_calc_subtree(child);
> + }
> +}
> +
> +static void clk_set_change(struct clk_core *core, unsigned long new_rate,
> + struct clk_core *new_parent, u8 p_index)
> +{
> core->new_rate = new_rate;
> core->new_parent = new_parent;
> core->new_parent_index = p_index;
> @@ -1729,11 +1737,6 @@ static void clk_calc_subtree(struct clk_core *core, unsigned long new_rate,
> core->new_child = NULL;
> if (new_parent && new_parent != core->parent)
> new_parent->new_child = core;
> -
> - hlist_for_each_entry(child, &core->children, child_node) {
> - child->new_rate = clk_recalc(child, new_rate);
> - clk_calc_subtree(child, child->new_rate, NULL, 0);
> - }
> }
>
> /*
> @@ -1744,7 +1747,7 @@ static struct clk_core *clk_calc_new_rates(struct clk_core *core,
> unsigned long rate)
> {
> struct clk_core *top = core;
> - struct clk_core *old_parent, *parent;
> + struct clk_core *old_parent, *parent, *child;
> unsigned long best_parent_rate = 0;
> unsigned long new_rate;
> unsigned long min_rate;
> @@ -1791,6 +1794,8 @@ static struct clk_core *clk_calc_new_rates(struct clk_core *core,
> /* pass-through clock with adjustable parent */
> top = clk_calc_new_rates(parent, rate);
> new_rate = parent->new_rate;
> + hlist_for_each_entry(child, &parent->children, child_node)
> + child->new_rate = clk_recalc(child, new_rate);
> goto out;
> }
>
> @@ -1813,11 +1818,14 @@ static struct clk_core *clk_calc_new_rates(struct clk_core *core,
> }
>
> if ((core->flags & CLK_SET_RATE_PARENT) && parent &&
> - best_parent_rate != parent->rate)
> + best_parent_rate != parent->rate) {
> top = clk_calc_new_rates(parent, best_parent_rate);
> + hlist_for_each_entry(child, &parent->children, child_node)
> + child->new_rate = clk_recalc(child, parent->new_rate);
> + }
>
> out:
> - clk_calc_subtree(core, new_rate, parent, p_index);
> + clk_set_change(core, new_rate, parent, p_index);
>
> return top;
> }
> @@ -2018,6 +2026,8 @@ static int clk_core_set_rate_nolock(struct clk_core *core,
> if (ret)
> return ret;
>
> + clk_calc_subtree(core);
This should be:
hlist_for_each_entry(child, core->new_parent? core->new_parent :
core->parent, child_node)
clk_calc_subtree(child);
> +
> /* notify that we are about to change rates */
> fail_clk = clk_propagate_rate_change(top, PRE_RATE_CHANGE);
> if (fail_clk) {
> --
> 2.19.1.568.g152ad8e336-goog
>
next prev parent reply other threads:[~2018-11-01 2:58 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-24 1:31 [PATCH 0/6] Coordinated Clks Derek Basehore
2018-10-24 1:31 ` [PATCH 1/6] clk: Remove recursion in clk_core_{prepare,enable}() Derek Basehore
2018-10-24 9:51 ` Jerome Brunet
2018-10-24 20:15 ` dbasehore .
2018-10-24 20:23 ` dbasehore .
2018-10-24 20:50 ` dbasehore .
2018-10-25 8:57 ` Jerome Brunet
2018-10-24 20:36 ` dbasehore .
2018-10-25 8:12 ` Jerome Brunet
2018-10-24 13:07 ` Stephen Boyd
2018-10-24 20:09 ` dbasehore .
2018-10-24 1:31 ` [PATCH 2/6] clk: fix clk_calc_subtree compute duplications Derek Basehore
2018-11-01 2:58 ` dbasehore . [this message]
2018-10-24 1:31 ` [PATCH 3/6] clk: change rates via list iteration Derek Basehore
2018-10-26 3:29 ` dbasehore .
2018-10-24 1:31 ` [PATCH 4/6] clk: add pre clk changes support Derek Basehore
2018-10-24 1:31 ` [PATCH 5/6] docs: driver-api: add pre_rate_req to clk documentation Derek Basehore
2018-10-24 1:31 ` [PATCH 6/6] clk: rockchip: use pre_rate_req for cpuclk Derek Basehore
2018-10-24 4:06 ` dbasehore .
2018-12-20 21:15 ` [PATCH 0/6] Coordinated Clks Stephen Boyd
2018-12-20 23:20 ` dbasehore .
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAGAzgsp-tuSAThRGPtGM98opK0pJ5OfmxB9tx+9VBuxT6rz3cA@mail.gmail.com \
--to=dbasehore@chromium.org \
--cc=aisheng.dong@nxp.com \
--cc=corbet@lwn.net \
--cc=heiko@sntech.de \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rockchip@lists.infradead.org \
--cc=mchehab+samsung@kernel.org \
--cc=mturquette@baylibre.com \
--cc=sboyd@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).