aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
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
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')
-rw-r--r--arch/arm/mach-realview/hotplug.c20
-rw-r--r--arch/arm/mach-s5pv310/hotplug.c20
-rw-r--r--arch/arm/mach-tegra/hotplug.c20
3 files changed, 33 insertions, 27 deletions
diff --git a/arch/arm/mach-realview/hotplug.c b/arch/arm/mach-realview/hotplug.c
index e06572e6c490..b6387cfe7044 100644
--- a/arch/arm/mach-realview/hotplug.c
+++ b/arch/arm/mach-realview/hotplug.c
@@ -53,7 +53,7 @@ static inline void cpu_leave_lowpower(void)
53 : "cc"); 53 : "cc");
54} 54}
55 55
56static inline void platform_do_lowpower(unsigned int cpu) 56static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
57{ 57{
58 /* 58 /*
59 * there is no power-control hardware on this platform, so all 59 * there is no power-control hardware on this platform, so all
@@ -77,16 +77,13 @@ static inline void platform_do_lowpower(unsigned int cpu)
77 } 77 }
78 78
79 /* 79 /*
80 * getting here, means that we have come out of WFI without 80 * Getting here, means that we have come out of WFI without
81 * having been woken up - this shouldn't happen 81 * having been woken up - this shouldn't happen
82 * 82 *
83 * The trouble is, letting people know about this is not really 83 * Just note it happening - when we're woken, we can report
84 * possible, since we are currently running incoherently, and 84 * its occurrence.
85 * therefore cannot safely call printk() or anything else
86 */ 85 */
87#ifdef DEBUG 86 (*spurious)++;
88 printk("CPU%u: spurious wakeup call\n", cpu);
89#endif
90 } 87 }
91} 88}
92 89
@@ -102,17 +99,22 @@ int platform_cpu_kill(unsigned int cpu)
102 */ 99 */
103void platform_cpu_die(unsigned int cpu) 100void platform_cpu_die(unsigned int cpu)
104{ 101{
102 int spurious = 0;
103
105 /* 104 /*
106 * we're ready for shutdown now, so do it 105 * we're ready for shutdown now, so do it
107 */ 106 */
108 cpu_enter_lowpower(); 107 cpu_enter_lowpower();
109 platform_do_lowpower(cpu); 108 platform_do_lowpower(cpu, &spurious);
110 109
111 /* 110 /*
112 * bring this CPU back into the world of cache 111 * bring this CPU back into the world of cache
113 * coherency, and then restore interrupts 112 * coherency, and then restore interrupts
114 */ 113 */
115 cpu_leave_lowpower(); 114 cpu_leave_lowpower();
115
116 if (spurious)
117 pr_warn("CPU%u: %u spurious wakeup calls\n", cpu, spurious);
116} 118}
117 119
118int platform_cpu_disable(unsigned int cpu) 120int platform_cpu_disable(unsigned int cpu)
diff --git a/arch/arm/mach-s5pv310/hotplug.c b/arch/arm/mach-s5pv310/hotplug.c
index ea951ef6ea54..951ba6d63d21 100644
--- a/arch/arm/mach-s5pv310/hotplug.c
+++ b/arch/arm/mach-s5pv310/hotplug.c
@@ -56,7 +56,7 @@ static inline void cpu_leave_lowpower(void)
56 : "cc"); 56 : "cc");
57} 57}
58 58
59static inline void platform_do_lowpower(unsigned int cpu) 59static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
60{ 60{
61 /* 61 /*
62 * there is no power-control hardware on this platform, so all 62 * there is no power-control hardware on this platform, so all
@@ -80,16 +80,13 @@ static inline void platform_do_lowpower(unsigned int cpu)
80 } 80 }
81 81
82 /* 82 /*
83 * getting here, means that we have come out of WFI without 83 * Getting here, means that we have come out of WFI without
84 * having been woken up - this shouldn't happen 84 * having been woken up - this shouldn't happen
85 * 85 *
86 * The trouble is, letting people know about this is not really 86 * Just note it happening - when we're woken, we can report
87 * possible, since we are currently running incoherently, and 87 * its occurrence.
88 * therefore cannot safely call printk() or anything else
89 */ 88 */
90#ifdef DEBUG 89 (*spurious)++;
91 printk(KERN_WARN "CPU%u: spurious wakeup call\n", cpu);
92#endif
93 } 90 }
94} 91}
95 92
@@ -105,17 +102,22 @@ int platform_cpu_kill(unsigned int cpu)
105 */ 102 */
106void platform_cpu_die(unsigned int cpu) 103void platform_cpu_die(unsigned int cpu)
107{ 104{
105 int spurious = 0;
106
108 /* 107 /*
109 * we're ready for shutdown now, so do it 108 * we're ready for shutdown now, so do it
110 */ 109 */
111 cpu_enter_lowpower(); 110 cpu_enter_lowpower();
112 platform_do_lowpower(cpu); 111 platform_do_lowpower(cpu, &spurious);
113 112
114 /* 113 /*
115 * bring this CPU back into the world of cache 114 * bring this CPU back into the world of cache
116 * coherency, and then restore interrupts 115 * coherency, and then restore interrupts
117 */ 116 */
118 cpu_leave_lowpower(); 117 cpu_leave_lowpower();
118
119 if (spurious)
120 pr_warn("CPU%u: %u spurious wakeup calls\n", cpu, spurious);
119} 121}
120 122
121int platform_cpu_disable(unsigned int cpu) 123int platform_cpu_disable(unsigned int cpu)
diff --git a/arch/arm/mach-tegra/hotplug.c b/arch/arm/mach-tegra/hotplug.c
index a5eeb9126645..17faf777af23 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)