Warning at kernel/mutex.c

Fabio Estevam festevam at gmail.com
Tue Oct 18 14:33:07 EDT 2011


On Tue, Oct 18, 2011 at 3:37 PM, Russell King - ARM Linux
<linux at arm.linux.org.uk> wrote:

> clk_enable() shouldn't be taking a mutex because drivers can _and_ do
> call it from non-schedulable contexts.  Unfortunately, some clk_enable
> implementations do use a mutex.
>
> We have a transition path for this, discussed quite a while ago -
> introducing clk_prepare() to do the slow bits of enabling a clock,
> leaving clk_enable() for the fast stuff.
>

Thanks for the explanation, Russell.

Sascha,

Would the conversion from mutex to spinlock in clk_enable/disable work
in the meantime?

Please see below.

OMAP/PXA/Tegra also use spinlock in clk_enable/disable.

If this is OK then I can submit a proper patch for mxc and mxs.

diff --git a/arch/arm/mach-mxs/clock.c b/arch/arm/mach-mxs/clock.c
index a7093c8..1cdc21a 100644
--- a/arch/arm/mach-mxs/clock.c
+++ b/arch/arm/mach-mxs/clock.c
@@ -42,6 +42,7 @@

 static LIST_HEAD(clocks);
 static DEFINE_MUTEX(clocks_mutex);
+static DEFINE_SPINLOCK(clock_lock);

 /*-------------------------------------------------------------------------
  * Standard clock functions defined in include/linux/clk.h
@@ -80,13 +81,14 @@ static int __clk_enable(struct clk *clk)
 int clk_enable(struct clk *clk)
 {
 	int ret = 0;
+	unsigned long flags;

 	if (clk == NULL || IS_ERR(clk))
 		return -EINVAL;

-	mutex_lock(&clocks_mutex);
+	spin_lock_irqsave(&clock_lock, flags);
 	ret = __clk_enable(clk);
-	mutex_unlock(&clocks_mutex);
+	spin_unlock_irqrestore(&clock_lock, flags);

 	return ret;
 }
@@ -98,12 +100,14 @@ EXPORT_SYMBOL(clk_enable);
  */
 void clk_disable(struct clk *clk)
 {
+	unsigned long flags;
+
 	if (clk == NULL || IS_ERR(clk))
 		return;

-	mutex_lock(&clocks_mutex);
+	spin_lock_irqsave(&clock_lock, flags);
 	__clk_disable(clk);
-	mutex_unlock(&clocks_mutex);
+	spin_unlock_irqrestore(&clock_lock, flags);
 }
 EXPORT_SYMBOL(clk_disable);



More information about the linux-arm-kernel mailing list