Patch "clk: add missing lock when call clk_core_enable in clk_set_parent" has been added to the 4.0-stable tree
Subsystems (2)
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
d2a5d46b167a9a8231264daf80165b739aecf1d7Mon 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.
--- 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(strucstruct 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_cclk_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