diff mbox series

clk: Unlink clock if failed to prepare or enable

Message ID 20200505140953.409430-1-maz@kernel.org (mailing list archive)
State Accepted, archived
Headers show
Series clk: Unlink clock if failed to prepare or enable | expand

Commit Message

Marc Zyngier May 5, 2020, 2:09 p.m. UTC
On failing to prepare or enable a clock, remove the core structure
from the list it has been inserted as it is about to be freed.

This otherwise leads to random crashes when subsequent clocks get
registered, during which parsing of the clock tree becomes adventurous.

Observed with QEMU's RPi-3 emulation.

Fixes: 12ead77432f2 ("clk: Don't try to enable critical clocks if prepare failed")
Signed-off-by: Marc Zyngier <maz@kernel.org>
Cc: Guenter Roeck <linux@roeck-us.net>
Cc: Stephen Boyd <sboyd@kernel.org>
Cc: Michael Turquette <mturquette@baylibre.com>
---
 drivers/clk/clk.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Stephen Boyd May 5, 2020, 7:12 p.m. UTC | #1
Quoting Marc Zyngier (2020-05-05 07:09:53)
> On failing to prepare or enable a clock, remove the core structure
> from the list it has been inserted as it is about to be freed.
> 
> This otherwise leads to random crashes when subsequent clocks get
> registered, during which parsing of the clock tree becomes adventurous.
> 
> Observed with QEMU's RPi-3 emulation.
> 
> Fixes: 12ead77432f2 ("clk: Don't try to enable critical clocks if prepare failed")
> Signed-off-by: Marc Zyngier <maz@kernel.org>
> Cc: Guenter Roeck <linux@roeck-us.net>
> Cc: Stephen Boyd <sboyd@kernel.org>
> Cc: Michael Turquette <mturquette@baylibre.com>
> ---

Applied to clk-fixes
diff mbox series

Patch

diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index b34fc1d3a594..752e8eef3f55 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -3522,6 +3522,9 @@  static int __clk_core_init(struct clk_core *core)
 out:
 	clk_pm_runtime_put(core);
 unlock:
+	if (ret)
+		hlist_del_init(&core->child_node);
+
 	clk_prepare_unlock();
 
 	if (!ret)