Messages in this thread | | | Date | Mon, 29 Nov 2021 10:14:28 -0800 | Subject | Re: [PATCH] clk: Fix children not voting entire parent chain during init | From | Mike Tipton <> |
| |
On 11/8/2021 8:34 PM, Mike Tipton wrote: > If a child's parent is set by calling __clk_init_parent() while the > parent is still being registered in __clk_register(), then it can result > in the child voting its direct parent without those votes propagating up > the entire parent chain. > > __clk_register() sets hw->core before grabbing the prepare_lock and > before initializing hw->core->parent. Since hw->core is used indirectly > by __clk_init_parent(), then children can find their parents before > they're fully initialized. If children vote for their parents during > this window, then those votes won't propagate past the direct parent. > > This can happen when: > 1. CRITICAL clocks are enabled in __clk_core_init(). > 2. Reparenting enabled orphans in clk_core_reparent_orphans_nolock(). > > Fix this by not setting hw->core until we've already grabbed the > prepare_lock in __clk_core_init(). This prevents orphaned children from > finding and voting their parents before the parents are fully > initialized. > > Fixes: fc0c209c147f ("clk: Allow parents to be specified without string names") > Signed-off-by: Mike Tipton <quic_mdtipton@quicinc.com> > --- > > This is very difficult to reproduce. We can't reproduce it at all > internally, in fact. But some customers are able to reproduce it fairly > easily and this patch fixes it for them. > > drivers/clk/clk.c | 14 +++++++++++--- > 1 file changed, 11 insertions(+), 3 deletions(-) >
Reminder. We've had more reports of this and in each case this patch fixes the problem.
| |