diff options
author | Stephen Boyd <sboyd@codeaurora.org> | 2014-12-12 18:04:16 -0500 |
---|---|---|
committer | Michael Turquette <mturquette@linaro.org> | 2014-12-15 20:02:06 -0500 |
commit | 89f7e9de59bf3e3cda2e00de12c66db22675a7cf (patch) | |
tree | 5c6581ff9dfb4fd9574025ef10aeb645b5835176 /drivers/clk | |
parent | c9b928148eb430bc2beb486d94efd2c3bc439a0c (diff) |
clk: Really fix deadlock with mmap_sem
Commit 6314b6796e3c (clk: Don't hold prepare_lock across debugfs
creation, 2014-09-04) forgot to update one place where we hold
the prepare_lock while creating debugfs directories. This means
we still have the chance of a deadlock that the commit was trying
to fix. Actually fix it by moving the debugfs creation outside
the prepare_lock.
Cc: <stable@vger.kernel.org> # 3.18
Reported-by: Russell King <rmk+kernel@arm.linux.org.uk>
Fixes: 6314b6796e3c "clk: Don't hold prepare_lock across debugfs creation"
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Michael Turquette <mturquette@linaro.org>
[mturquette@linaro.org: removed lockdep_assert]
Diffstat (limited to 'drivers/clk')
-rw-r--r-- | drivers/clk/clk.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 44cdc47a6cc5..f4963b7d4e17 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c | |||
@@ -240,7 +240,6 @@ static const struct file_operations clk_dump_fops = { | |||
240 | .release = single_release, | 240 | .release = single_release, |
241 | }; | 241 | }; |
242 | 242 | ||
243 | /* caller must hold prepare_lock */ | ||
244 | static int clk_debug_create_one(struct clk *clk, struct dentry *pdentry) | 243 | static int clk_debug_create_one(struct clk *clk, struct dentry *pdentry) |
245 | { | 244 | { |
246 | struct dentry *d; | 245 | struct dentry *d; |
@@ -1944,7 +1943,6 @@ int __clk_init(struct device *dev, struct clk *clk) | |||
1944 | else | 1943 | else |
1945 | clk->rate = 0; | 1944 | clk->rate = 0; |
1946 | 1945 | ||
1947 | clk_debug_register(clk); | ||
1948 | /* | 1946 | /* |
1949 | * walk the list of orphan clocks and reparent any that are children of | 1947 | * walk the list of orphan clocks and reparent any that are children of |
1950 | * this clock | 1948 | * this clock |
@@ -1979,6 +1977,9 @@ int __clk_init(struct device *dev, struct clk *clk) | |||
1979 | out: | 1977 | out: |
1980 | clk_prepare_unlock(); | 1978 | clk_prepare_unlock(); |
1981 | 1979 | ||
1980 | if (!ret) | ||
1981 | clk_debug_register(clk); | ||
1982 | |||
1982 | return ret; | 1983 | return ret; |
1983 | } | 1984 | } |
1984 | 1985 | ||