linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [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).