* [PATCH] ARM: Stop secondary cpus in machine_halt()
@ 2010-07-01 22:47 Olof Johansson
2010-07-01 23:11 ` Russell King - ARM Linux
2010-07-03 18:46 ` [PATCH v2] " Olof Johansson
0 siblings, 2 replies; 7+ messages in thread
From: Olof Johansson @ 2010-07-01 22:47 UTC (permalink / raw)
To: linux-arm-kernel
ARM doesn't spin down secondary cpus on halt, which results in interrupts
being delivered even after the "System halted" message, etc.
Change that to use smp_send_stop() to halt them. Also, change the
smp_send_stop() on ARM to not do a stack dump when stopping.
Signed-off-by: Olof Johansson <olof@lixom.net>
---
arch/arm/kernel/process.c | 6 ++++++
arch/arm/kernel/smp.c | 10 ++++++----
2 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
index acf5e6f..203fc1b 100644
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -191,6 +191,12 @@ __setup("reboot=", reboot_setup);
void machine_halt(void)
{
+#ifdef CONFIG_SMP
+ smp_send_stop();
+#endif
+ printk(KERN_EMERG "System halted, OK to turn off power\n");
+ local_irq_disable();
+ while (1) ;
}
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
index b8c3d0f..5496dea 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
@@ -467,10 +467,12 @@ static DEFINE_SPINLOCK(stop_lock);
*/
static void ipi_cpu_stop(unsigned int cpu)
{
- spin_lock(&stop_lock);
- printk(KERN_CRIT "CPU%u: stopping\n", cpu);
- dump_stack();
- spin_unlock(&stop_lock);
+ if (system_state != SYSTEM_HALT) {
+ spin_lock(&stop_lock);
+ printk(KERN_CRIT "CPU%u: stopping\n", cpu);
+ dump_stack();
+ spin_unlock(&stop_lock);
+ }
set_cpu_online(cpu, false);
--
1.5.6.5
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH] ARM: Stop secondary cpus in machine_halt()
2010-07-01 22:47 [PATCH] ARM: Stop secondary cpus in machine_halt() Olof Johansson
@ 2010-07-01 23:11 ` Russell King - ARM Linux
2010-07-02 0:10 ` Olof Johansson
2010-07-03 18:46 ` [PATCH v2] " Olof Johansson
1 sibling, 1 reply; 7+ messages in thread
From: Russell King - ARM Linux @ 2010-07-01 23:11 UTC (permalink / raw)
To: linux-arm-kernel
On Thu, Jul 01, 2010 at 05:47:06PM -0500, Olof Johansson wrote:
> ARM doesn't spin down secondary cpus on halt, which results in interrupts
> being delivered even after the "System halted" message, etc.
>
> Change that to use smp_send_stop() to halt them. Also, change the
> smp_send_stop() on ARM to not do a stack dump when stopping.
Actually, we want stack dumps - sometimes. For instance, when we
panic() or similar.
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH] ARM: Stop secondary cpus in machine_halt()
2010-07-01 23:11 ` Russell King - ARM Linux
@ 2010-07-02 0:10 ` Olof Johansson
0 siblings, 0 replies; 7+ messages in thread
From: Olof Johansson @ 2010-07-02 0:10 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Jul 02, 2010 at 12:11:28AM +0100, Russell King - ARM Linux wrote:
> On Thu, Jul 01, 2010 at 05:47:06PM -0500, Olof Johansson wrote:
> > ARM doesn't spin down secondary cpus on halt, which results in interrupts
> > being delivered even after the "System halted" message, etc.
> >
> > Change that to use smp_send_stop() to halt them. Also, change the
> > smp_send_stop() on ARM to not do a stack dump when stopping.
>
> Actually, we want stack dumps - sometimes. For instance, when we
> panic() or similar.
Do we really want the stack dumps of all cpus at panic time? They won't be
printed precisely since the IPI takes a while to make it over.
As the size of SMP systems grow, it'll also become too spammy.
Anyway, the patch only changes behaviour when the system_state is
SYSTEM_HALT, i.e. during shutdown so all other panics will still
dump stacks from all cpus.
-Olof
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2] ARM: Stop secondary cpus in machine_halt()
2010-07-01 22:47 [PATCH] ARM: Stop secondary cpus in machine_halt() Olof Johansson
2010-07-01 23:11 ` Russell King - ARM Linux
@ 2010-07-03 18:46 ` Olof Johansson
2010-07-12 16:48 ` Russell King - ARM Linux
1 sibling, 1 reply; 7+ messages in thread
From: Olof Johansson @ 2010-07-03 18:46 UTC (permalink / raw)
To: linux-arm-kernel
ARM doesn't spin down secondary cpus on halt, which resulted interrupts
being delivered even after the "System halted" message, etc.
Change that to use smp_send_stop() to halt them.
Also, change the smp_send_stop() on ARM to not do a stack dump when
stopping the cpus during halt (but still print during other stops,
i.e. panic).
Signed-off-by: Olof Johansson <olof@lixom.net>
---
arch/arm/kernel/process.c | 6 ++++++
arch/arm/kernel/smp.c | 10 ++++++----
2 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
index acf5e6f..203fc1b 100644
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -191,6 +191,12 @@ __setup("reboot=", reboot_setup);
void machine_halt(void)
{
+#ifdef CONFIG_SMP
+ smp_send_stop();
+#endif
+ printk(KERN_EMERG "System halted, OK to turn off power\n");
+ local_irq_disable();
+ while (1) ;
}
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
index b8c3d0f..5496dea 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
@@ -467,10 +467,12 @@ static DEFINE_SPINLOCK(stop_lock);
*/
static void ipi_cpu_stop(unsigned int cpu)
{
- spin_lock(&stop_lock);
- printk(KERN_CRIT "CPU%u: stopping\n", cpu);
- dump_stack();
- spin_unlock(&stop_lock);
+ if (system_state != SYSTEM_HALT) {
+ spin_lock(&stop_lock);
+ printk(KERN_CRIT "CPU%u: stopping\n", cpu);
+ dump_stack();
+ spin_unlock(&stop_lock);
+ }
set_cpu_online(cpu, false);
--
1.5.6.5
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2] ARM: Stop secondary cpus in machine_halt()
2010-07-03 18:46 ` [PATCH v2] " Olof Johansson
@ 2010-07-12 16:48 ` Russell King - ARM Linux
2010-07-26 12:31 ` Russell King - ARM Linux
0 siblings, 1 reply; 7+ messages in thread
From: Russell King - ARM Linux @ 2010-07-12 16:48 UTC (permalink / raw)
To: linux-arm-kernel
On Sat, Jul 03, 2010 at 01:46:14PM -0500, Olof Johansson wrote:
> ARM doesn't spin down secondary cpus on halt, which resulted interrupts
> being delivered even after the "System halted" message, etc.
>
> Change that to use smp_send_stop() to halt them.
>
> Also, change the smp_send_stop() on ARM to not do a stack dump when
> stopping the cpus during halt (but still print during other stops,
> i.e. panic).
Hmm... what about kexec on a SMP system, or we try to reboot a SMP
system?
The x86 code suggests that we put smp_send_stop() inside
machine_shutdown() (and move that function into arch/arm/kernel/process.c)
and call it from machine_halt() and machine_reboot().
This will cover the kexec and reboot cases too.
So, something like this:
diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c
index 598ca61..4acce99 100644
--- a/arch/arm/kernel/machine_kexec.c
+++ b/arch/arm/kernel/machine_kexec.c
@@ -37,10 +37,6 @@ void machine_kexec_cleanup(struct kimage *image)
{
}
-void machine_shutdown(void)
-{
-}
-
void machine_crash_shutdown(struct pt_regs *regs)
{
}
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
index a4a9cc8..ceb2aa4 100644
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -189,19 +189,29 @@ int __init reboot_setup(char *str)
__setup("reboot=", reboot_setup);
-void machine_halt(void)
+void machine_shutdown(void)
{
+#ifdef CONFIG_SMP
+ smp_send_stop();
+#endif
}
+void machine_halt(void)
+{
+ machine_shutdown();
+ while (1);
+}
void machine_power_off(void)
{
+ machine_shutdown();
if (pm_power_off)
pm_power_off();
}
void machine_restart(char *cmd)
{
+ machine_shutdown();
arm_pm_restart(reboot_mode, cmd);
}
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
index b8c3d0f..11f631b 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
@@ -467,10 +467,13 @@ static DEFINE_SPINLOCK(stop_lock);
*/
static void ipi_cpu_stop(unsigned int cpu)
{
- spin_lock(&stop_lock);
- printk(KERN_CRIT "CPU%u: stopping\n", cpu);
- dump_stack();
- spin_unlock(&stop_lock);
+ if (system_state == SYSTEM_BOOTING ||
+ system_state == SYSTEM_RUNNING) {
+ spin_lock(&stop_lock);
+ printk(KERN_CRIT "CPU%u: stopping\n", cpu);
+ dump_stack();
+ spin_unlock(&stop_lock);
+ }
set_cpu_online(cpu, false);
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2] ARM: Stop secondary cpus in machine_halt()
2010-07-12 16:48 ` Russell King - ARM Linux
@ 2010-07-26 12:31 ` Russell King - ARM Linux
2010-07-26 15:26 ` Olof Johansson
0 siblings, 1 reply; 7+ messages in thread
From: Russell King - ARM Linux @ 2010-07-26 12:31 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Jul 12, 2010 at 05:48:10PM +0100, Russell King - ARM Linux wrote:
> Hmm... what about kexec on a SMP system, or we try to reboot a SMP
> system?
>
> The x86 code suggests that we put smp_send_stop() inside
> machine_shutdown() (and move that function into arch/arm/kernel/process.c)
> and call it from machine_halt() and machine_reboot().
>
> This will cover the kexec and reboot cases too.
As no one's commented on this, I'm going to apply it later today for
the next merge window - it seems to be the right way to solve this
problem, and makes us reflect what x86 does.
> So, something like this:
>
> diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c
> index 598ca61..4acce99 100644
> --- a/arch/arm/kernel/machine_kexec.c
> +++ b/arch/arm/kernel/machine_kexec.c
> @@ -37,10 +37,6 @@ void machine_kexec_cleanup(struct kimage *image)
> {
> }
>
> -void machine_shutdown(void)
> -{
> -}
> -
> void machine_crash_shutdown(struct pt_regs *regs)
> {
> }
> diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
> index a4a9cc8..ceb2aa4 100644
> --- a/arch/arm/kernel/process.c
> +++ b/arch/arm/kernel/process.c
> @@ -189,19 +189,29 @@ int __init reboot_setup(char *str)
>
> __setup("reboot=", reboot_setup);
>
> -void machine_halt(void)
> +void machine_shutdown(void)
> {
> +#ifdef CONFIG_SMP
> + smp_send_stop();
> +#endif
> }
>
> +void machine_halt(void)
> +{
> + machine_shutdown();
> + while (1);
> +}
>
> void machine_power_off(void)
> {
> + machine_shutdown();
> if (pm_power_off)
> pm_power_off();
> }
>
> void machine_restart(char *cmd)
> {
> + machine_shutdown();
> arm_pm_restart(reboot_mode, cmd);
> }
>
> diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
> index b8c3d0f..11f631b 100644
> --- a/arch/arm/kernel/smp.c
> +++ b/arch/arm/kernel/smp.c
> @@ -467,10 +467,13 @@ static DEFINE_SPINLOCK(stop_lock);
> */
> static void ipi_cpu_stop(unsigned int cpu)
> {
> - spin_lock(&stop_lock);
> - printk(KERN_CRIT "CPU%u: stopping\n", cpu);
> - dump_stack();
> - spin_unlock(&stop_lock);
> + if (system_state == SYSTEM_BOOTING ||
> + system_state == SYSTEM_RUNNING) {
> + spin_lock(&stop_lock);
> + printk(KERN_CRIT "CPU%u: stopping\n", cpu);
> + dump_stack();
> + spin_unlock(&stop_lock);
> + }
>
> set_cpu_online(cpu, false);
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2] ARM: Stop secondary cpus in machine_halt()
2010-07-26 12:31 ` Russell King - ARM Linux
@ 2010-07-26 15:26 ` Olof Johansson
0 siblings, 0 replies; 7+ messages in thread
From: Olof Johansson @ 2010-07-26 15:26 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Jul 26, 2010 at 01:31:13PM +0100, Russell King - ARM Linux wrote:
> On Mon, Jul 12, 2010 at 05:48:10PM +0100, Russell King - ARM Linux wrote:
> > Hmm... what about kexec on a SMP system, or we try to reboot a SMP
> > system?
> >
> > The x86 code suggests that we put smp_send_stop() inside
> > machine_shutdown() (and move that function into arch/arm/kernel/process.c)
> > and call it from machine_halt() and machine_reboot().
> >
> > This will cover the kexec and reboot cases too.
>
> As no one's commented on this, I'm going to apply it later today for
> the next merge window - it seems to be the right way to solve this
> problem, and makes us reflect what x86 does.
Yeah, looks good to me.
Acked-by: Olof Johansson <olof@lixom.net>
-Olof
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2010-07-26 15:26 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-07-01 22:47 [PATCH] ARM: Stop secondary cpus in machine_halt() Olof Johansson
2010-07-01 23:11 ` Russell King - ARM Linux
2010-07-02 0:10 ` Olof Johansson
2010-07-03 18:46 ` [PATCH v2] " Olof Johansson
2010-07-12 16:48 ` Russell King - ARM Linux
2010-07-26 12:31 ` Russell King - ARM Linux
2010-07-26 15:26 ` Olof Johansson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).