aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-tegra/hotplug.c
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2010-12-19 06:30:43 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2010-12-20 10:09:14 -0500
commitd4450261e546953c4a1ce8b48e29164a57c6ed33 (patch)
treeb0f06bdcf316b78a05fb6e14167b4cccb247d78f /arch/arm/mach-tegra/hotplug.c
parent58613cd1d4f8c2d5f25b6c57ad7fbed80e75a67b (diff)
ARM: CPU hotplug: fix reporting of spurious wakeups
The original scheme for reporting spurious wakeups was broken - it tried to use printk() from a context which wasn't coherent with the other CPUs, which risks corrupting the printk() data. Fix this by noting the number spurious wakeups, and only report them when we are properly woken - when we will be coherent with the rest of the system. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/mach-tegra/hotplug.c')
-rw-r--r--arch/arm/mach-tegra/hotplug.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/arch/arm/mach-tegra/hotplug.c b/arch/arm/mach-tegra/hotplug.c
index a5eeb912664..17faf777af2 100644
--- a/arch/arm/mach-tegra/hotplug.c
+++ b/arch/arm/mach-tegra/hotplug.c
@@ -52,7 +52,7 @@ static inline void cpu_leave_lowpower(void)
52 : "cc"); 52 : "cc");
53} 53}
54 54
55static inline void platform_do_lowpower(unsigned int cpu) 55static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
56{ 56{
57 /* 57 /*
58 * there is no power-control hardware on this platform, so all 58 * there is no power-control hardware on this platform, so all
@@ -76,16 +76,13 @@ static inline void platform_do_lowpower(unsigned int cpu)
76 /*}*/ 76 /*}*/
77 77
78 /* 78 /*
79 * getting here, means that we have come out of WFI without 79 * Getting here, means that we have come out of WFI without
80 * having been woken up - this shouldn't happen 80 * having been woken up - this shouldn't happen
81 * 81 *
82 * The trouble is, letting people know about this is not really 82 * Just note it happening - when we're woken, we can report
83 * possible, since we are currently running incoherently, and 83 * its occurrence.
84 * therefore cannot safely call printk() or anything else
85 */ 84 */
86#ifdef DEBUG 85 (*spurious)++;
87 printk(KERN_WARN "CPU%u: spurious wakeup call\n", cpu);
88#endif
89 } 86 }
90} 87}
91 88
@@ -101,17 +98,22 @@ int platform_cpu_kill(unsigned int cpu)
101 */ 98 */
102void platform_cpu_die(unsigned int cpu) 99void platform_cpu_die(unsigned int cpu)
103{ 100{
101 int spurious = 0;
102
104 /* 103 /*
105 * we're ready for shutdown now, so do it 104 * we're ready for shutdown now, so do it
106 */ 105 */
107 cpu_enter_lowpower(); 106 cpu_enter_lowpower();
108 platform_do_lowpower(cpu); 107 platform_do_lowpower(cpu, &spurious);
109 108
110 /* 109 /*
111 * bring this CPU back into the world of cache 110 * bring this CPU back into the world of cache
112 * coherency, and then restore interrupts 111 * coherency, and then restore interrupts
113 */ 112 */
114 cpu_leave_lowpower(); 113 cpu_leave_lowpower();
114
115 if (spurious)
116 pr_warn("CPU%u: %u spurious wakeup calls\n", cpu, spurious);
115} 117}
116 118
117int platform_cpu_disable(unsigned int cpu) 119int platform_cpu_disable(unsigned int cpu)