lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20190729224652.17291206E0@mail.kernel.org>
Date:   Mon, 29 Jul 2019 15:46:51 -0700
From:   Stephen Boyd <sboyd@...nel.org>
To:     Bjorn Andersson <bjorn.andersson@...aro.org>,
        Michael Turquette <mturquette@...libre.com>
Cc:     linux-clk@...r.kernel.org, linux-kernel@...r.kernel.org,
        linux-arm-msm@...r.kernel.org, Rob Clark <robclark@...il.com>,
        Sean Paul <seanpaul@...omium.org>
Subject: Re: [RFC] clk: Remove cached cores in parent map during unregister

Quoting Bjorn Andersson (2019-07-22 22:14:46)
> As clocks are registered their parents are resolved and the parent_map
> is updated to cache the clk_core objects of each existing parent.
> But in the event of a clock being unregistered this cache will carry
> dangling pointers if not invalidated, so do this for all children of the
> clock being unregistered.
> 
> Signed-off-by: Bjorn Andersson <bjorn.andersson@...aro.org>
> ---
> 
> This resolves the issue seen where the DSI PLL (and it's provided clocks) is
> being registered and unregistered multiple times due to probe deferral.
> 
> Marking it RFC because I don't fully understand the life of the clock yet.

The concept sounds sane but the implementation is going to be not much
fun. The problem is that a clk can be in many different parent caches,
even ones for clks that aren't currently parented to it. We would need
to walk the entire tree(s) and find anywhere that we've cached the
clk_core pointer and invalidate it. Maybe we can speed that up a little
bit by keeping a reference to the entry of each parent cache that is for
the parent we're removing, essentially holding an inverse cache, but I'm
not sure it will provide any benefit besides wasting space for this one
operation that we shouldn't be doing very often if at all.

It certainly sounds easier to iterate through the whole tree and just
invalidate entries in all the caches under the prepare lock. We can
optimize it later.

> 
>  drivers/clk/clk.c | 18 +++++++++++++++---
>  1 file changed, 15 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
> index c0990703ce54..8cd1ad977c50 100644
> --- a/drivers/clk/clk.c
> +++ b/drivers/clk/clk.c
> @@ -2517,7 +2528,8 @@ int clk_set_parent(struct clk *clk, struct clk *parent)
>                 clk_core_rate_unprotect(clk->core);
>  
>         ret = clk_core_set_parent_nolock(clk->core,
> -                                        parent ? parent->core : NULL);
> +                                        parent ? parent->core : NULL,
> +                                        false);

Nitpick. I'd prefer another function to invalidate the cache of a clk
given another clk_core pointer.

>  
>         if (clk->exclusive_count)
>                 clk_core_rate_protect(clk->core);

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ