ARM: ux500:mach-ux500/cpuidle.c spinlock dis-matching
From: Steve zhan <hidden>
Date: 2013-01-19 06:33:58
Subsystem:
arm port, arm/nomadik/ux500 architectures, the rest · Maintainers:
Russell King, Linus Walleij, Linus Torvalds
Hi Daniel,Linus Walleij. Using MUTT resubmit this for http://lists.infradead.org/pipermail/linux-arm-kernel/2013-January/139893.html --- Steve commit 99d0a05d163bd070eba7caab7e772206edbcbbc9 Author: steve zhan [off-list ref] Date: Mon Jan 7 18:19:14 2013 +0800 ARM: ux500: add spin_unlock(&master_lock). Add the missing spin_unlock statement to unlock master_lock when prcmu_gic_decouple() return TRUE Signed-off-by: steve zhan [off-list ref]
diff --git a/arch/arm/mach-ux500/cpuidle.c b/arch/arm/mach-ux500/cpuidle.c
index b54884bd..ce91493 100644
--- a/arch/arm/mach-ux500/cpuidle.c
+++ b/arch/arm/mach-ux500/cpuidle.c@@ -40,8 +40,10 @@ static inline int ux500_enter_idle(struct cpuidle_device *dev, goto wfi; /* decouple the gic from the A9 cores */ - if (prcmu_gic_decouple()) + if (prcmu_gic_decouple()) { + spin_unlock(&master_lock); goto out; + } /* If an error occur, we will have to recouple the gic * manually */
2013/1/7 Daniel Lezcano [off-list ref]:
On 01/07/2013 06:50 AM, steve.zhan wrote:quoted
Hi Daniel, Happy new year, Thank you for reply. Sorry for that i have refer the old patch email. I have updated the patch, Pls check the URL: http://lists.infradead.org/pipermail/linux-arm-kernel/2012-December/138939.html Now i am using gmail GUI tools to send mail, i will switch email tool to MUTT to commit the other patchs in the future.Ok. Please do not introduce a new variable which is at the end pointless and add more complexity. You can simply remove the if statement for prcmu_gic_decouple(), or unlock if it fails. Thanks -- Danielquoted
-------------- steve.zhan 2013/1/7, Daniel Lezcano [off-list ref]:quoted
On 12/28/2012 08:06 AM, steve.zhan wrote:quoted
Hi Daniel,Hi Steve, sorry I missed your email.quoted
I think we must unlock the master spinlock even prcmu_gic_decouple function now always return 0. Could you give some infos about this?I agree, that would be cleaner. AFAICS, your patch does not solve the problem because 'recouple' will be false if prcmu_gic_decouple fails, so the lock will never be release. That will be simpler to do: if (prcmu_gic_decouple()) { spin_unlock(&master); goto out; } no ?quoted
Thanks.diff --git a/arch/arm/mach-ux500/cpuidle.cb/arch/arm/mach-ux500/cpuidle.c index b54884bd..b0759ce 100644--- a/arch/arm/mach-ux500/cpuidle.c +++ b/arch/arm/mach-ux500/cpuidle.c@@ -29,6 +29,7 @@ static inline int ux500_enter_idle(struct cpuidle_device*dev, { int this_cpu = smp_processor_id(); bool recouple = false; + bool locked = false; clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &this_cpu);@@ -39,6 +40,8 @@ static inline int ux500_enter_idle(struct cpuidle_device*dev, if (!spin_trylock(&master_lock)) goto wfi; + locked = true; + /* decouple the gic from the A9 cores */ if (prcmu_gic_decouple()) goto out;@@ -76,7 +79,7 @@ static inline int ux500_enter_idle(struct cpuidle_device*dev, /* When we switch to retention, the prcmu is in charge * of recoupling the gic automatically */ recouple = false; - + locked = false; spin_unlock(&master_lock); } wfi:@@ -86,7 +89,8 @@ out: if (recouple) { prcmu_gic_recouple(); - spin_unlock(&master_lock); + if (locked) + spin_unlock(&master_lock); } clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &this_cpu);Steve Zhan-- <http://www.linaro.org/> Linaro.org ?? Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog-- <http://www.linaro.org/> Linaro.org ?? Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog