Skip to contentSkip to conversation

Patch "clk: add missing lock when call clk_core_enable in clk_set_parent" has been added to the 4.0-stable tree

PATCH [email protected] 1 participant 1 message Jun 3, 2015

Subsystems (2)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

This is a note to let you know that I've just added the patch titled

clk: add missing lock when call clk_core_enable in clk_set_parent

to the 4.0-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
clk-add-missing-lock-when-call-clk_core_enable-in-clk_set_parent.patch
and it can be found in the queue-4.0 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 1 line

From d2a5d46b167a9a8231264daf80165b739aecf1d7 Mon Sep 17 00:00:00 2001

From: Dong Aisheng <[email protected]>
Date: Wed, 15 Apr 2015 22:26:36 +0800
Subject: clk: add missing lock when call clk_core_enable in clk_set_parent

From: Dong Aisheng <[email protected]>

commit d2a5d46b167a9a8231264daf80165b739aecf1d7 upstream.

Before commit 035a61c314eb ("clk: Make clk API return per-user struct clk instances") we acquired the enable_lock in __clk_set_parent_{before,after}() by means of calling clk_enable(). After commit 035a61c314eb we use clk_core_enable() in place of the clk_enable(), and clk_core_enable() doesn't acquire the enable_lock. This opens up a race condition between clk_set_parent() and clk_enable(). Fix it.

Fixes 035a61c314eb ("clk: Make clk API return per-user struct clk instances")
Cc Mike Turquette <[email protected]>
Cc Stephen Boyd <[email protected]>
---
 drivers/clk/clk.c |    8 ++++++++
 1 file changed, 8 insertions(+)
drivers/clk/clk.c +8 -0
@@ -1443,8 +1443,10 @@ static struct clk_core *__clk_set_parent
 	 */
 	if (clk->prepare_count) {
 		clk_core_prepare(parent);
+		flags = clk_enable_lock();
 		clk_core_enable(parent);
 		clk_core_enable(clk);
+		clk_enable_unlock(flags);
 	}
 
 	/* update the clk tree topology */
@@ -1459,13 +1461,17 @@ static void __clk_set_parent_after(struc
 				   struct clk_core *parent,
 				   struct clk_core *old_parent)
 {
+	unsigned long flags;
+
 	/*
 	 * Finish the migration of prepare state and undo the changes done
 	 * for preventing a race with clk_enable().
 	 */
 	if (core->prepare_count) {
+		flags = clk_enable_lock();
 		clk_core_disable(core);
 		clk_core_disable(old_parent);
+		clk_enable_unlock(flags);
 		clk_core_unprepare(old_parent);
 	}
 }
@@ -1489,8 +1495,10 @@ static int __clk_set_parent(struct clk_c
 		clk_enable_unlock(flags);
 
 		if (clk->prepare_count) {
+			flags = clk_enable_lock();
 			clk_core_disable(clk);
 			clk_core_disable(parent);
+			clk_enable_unlock(flags);
 			clk_core_unprepare(parent);
 		}
 		return ret;

Patches currently in stable-queue which might be from [email protected] are

queue-4.0/clk-add-missing-lock-when-call-clk_core_enable-in-clk_set_parent.patch