All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] clk: prevent erronous parsing of children during rate change
@ 2014-08-21 13:47 ` Tero Kristo
  0 siblings, 0 replies; 36+ messages in thread
From: Tero Kristo @ 2014-08-21 13:47 UTC (permalink / raw)
  To: linux-kernel, linux-omap, tony, nm, mturquette; +Cc: linux-arm-kernel

In some cases, clocks can switch their parent with clk_set_rate, for
example clk_mux can do this in some cases. Current implementation of
clk_change_rate uses un-safe list iteration on the clock children, which
will cause wrong clocks to be parsed in case any of the clock children
change their parents during the change rate operation. Fixed by using
the safe list iterator instead.

The problem was detected due to some divide by zero errors generated
by clock init on dra7-evm board, see discussion under
http://article.gmane.org/gmane.linux.ports.arm.kernel/349180 for details.

Signed-off-by: Tero Kristo <t-kristo@ti.com>
To: Mike Turquette <mturquette@linaro.org>
Reported-by: Nishanth Menon <nm@ti.com>
---
 drivers/clk/clk.c |    7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index b76fa69..bacc06f 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -1467,6 +1467,7 @@ static struct clk *clk_propagate_rate_change(struct clk *clk, unsigned long even
 static void clk_change_rate(struct clk *clk)
 {
 	struct clk *child;
+	struct hlist_node *tmp;
 	unsigned long old_rate;
 	unsigned long best_parent_rate = 0;
 	bool skip_set_rate = false;
@@ -1502,7 +1503,11 @@ static void clk_change_rate(struct clk *clk)
 	if (clk->notifier_count && old_rate != clk->rate)
 		__clk_notify(clk, POST_RATE_CHANGE, old_rate, clk->rate);
 
-	hlist_for_each_entry(child, &clk->children, child_node) {
+	/*
+	 * Use safe iteration, as change_rate can actually swap parents
+	 * for certain clock types.
+	 */
+	hlist_for_each_entry_safe(child, tmp, &clk->children, child_node) {
 		/* Skip children who will be reparented to another clock */
 		if (child->new_parent && child->new_parent != clk)
 			continue;
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 36+ messages in thread

end of thread, other threads:[~2014-10-02 13:32 UTC | newest]

Thread overview: 36+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-08-21 13:47 [PATCH] clk: prevent erronous parsing of children during rate change Tero Kristo
2014-08-21 13:47 ` Tero Kristo
2014-08-21 13:47 ` Tero Kristo
2014-08-21 13:59 ` Nishanth Menon
2014-08-21 13:59   ` Nishanth Menon
2014-08-21 13:59   ` Nishanth Menon
2014-09-03 19:22 ` Mike Turquette
2014-09-03 19:22   ` Mike Turquette
2014-09-17 18:27   ` Felipe Balbi
2014-09-17 18:27     ` Felipe Balbi
2014-09-17 18:27     ` Felipe Balbi
2014-09-22 19:18 ` Stephen Boyd
2014-09-22 19:18   ` Stephen Boyd
2014-09-23 13:38   ` Tero Kristo
2014-09-23 13:38     ` Tero Kristo
2014-09-23 13:38     ` Tero Kristo
2014-09-26  1:35     ` Stephen Boyd
2014-09-26  1:35       ` Stephen Boyd
2014-09-26  7:18       ` Tero Kristo
2014-09-26  7:18         ` Tero Kristo
2014-09-26  7:18         ` Tero Kristo
2014-09-26 23:24         ` Mike Turquette
2014-09-26 23:24           ` Mike Turquette
2014-09-29  8:09           ` Tero Kristo
2014-09-29  8:09             ` Tero Kristo
2014-09-29  8:09             ` Tero Kristo
2014-09-30  7:07             ` Mike Turquette
2014-09-30  7:07               ` Mike Turquette
2014-09-30  8:48               ` Tero Kristo
2014-09-30  8:48                 ` Tero Kristo
2014-09-30  8:48                 ` Tero Kristo
2014-09-30 19:03                 ` Mike Turquette
2014-09-30 19:03                   ` Mike Turquette
2014-10-02 13:31                   ` Tero Kristo
2014-10-02 13:31                     ` Tero Kristo
2014-10-02 13:31                     ` Tero Kristo

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.