public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] MIPS: Provide fallback reboot/poweroff/halt implementations
@ 2015-03-04 23:59 Andrew Bresticker
  2015-03-06 11:08 ` Maciej W. Rozycki
  2015-03-24 14:22 ` James Hogan
  0 siblings, 2 replies; 5+ messages in thread
From: Andrew Bresticker @ 2015-03-04 23:59 UTC (permalink / raw)
  To: Ralf Baechle; +Cc: linux-mips, linux-kernel, Andrew Bresticker

If a machine-specific hook is not implemented for restart, poweroff,
or halt, fall back to halting secondary CPUs, disabling interrupts,
and spinning.  In the case of restart, attempt to restart the system
via do_kernel_restart() (which will call any registered restart
handlers) before halting.

Signed-off-by: Andrew Bresticker <abrestic@chromium.org>
---
 arch/mips/kernel/reset.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/arch/mips/kernel/reset.c b/arch/mips/kernel/reset.c
index 07fc524..87b1f08 100644
--- a/arch/mips/kernel/reset.c
+++ b/arch/mips/kernel/reset.c
@@ -29,16 +29,36 @@ void machine_restart(char *command)
 {
 	if (_machine_restart)
 		_machine_restart(command);
+
+#ifdef CONFIG_SMP
+	smp_send_stop();
+#endif
+	do_kernel_restart(command);
+	pr_emerg("Reboot failed -- System halted\n");
+	local_irq_disable();
+	while (1);
 }
 
 void machine_halt(void)
 {
 	if (_machine_halt)
 		_machine_halt();
+
+#ifdef CONFIG_SMP
+	smp_send_stop();
+#endif
+	local_irq_disable();
+	while (1);
 }
 
 void machine_power_off(void)
 {
 	if (pm_power_off)
 		pm_power_off();
+
+#ifdef CONFIG_SMP
+	smp_send_stop();
+#endif
+	local_irq_disable();
+	while (1);
 }
-- 
2.2.0.rc0.207.ga3a616c


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] MIPS: Provide fallback reboot/poweroff/halt implementations
  2015-03-04 23:59 [PATCH] MIPS: Provide fallback reboot/poweroff/halt implementations Andrew Bresticker
@ 2015-03-06 11:08 ` Maciej W. Rozycki
  2015-03-24 14:22 ` James Hogan
  1 sibling, 0 replies; 5+ messages in thread
From: Maciej W. Rozycki @ 2015-03-06 11:08 UTC (permalink / raw)
  To: Andrew Bresticker; +Cc: Ralf Baechle, linux-mips, linux-kernel

On Wed, 4 Mar 2015, Andrew Bresticker wrote:

> If a machine-specific hook is not implemented for restart, poweroff,
> or halt, fall back to halting secondary CPUs, disabling interrupts,
> and spinning.  In the case of restart, attempt to restart the system
> via do_kernel_restart() (which will call any registered restart
> handlers) before halting.
> 
> Signed-off-by: Andrew Bresticker <abrestic@chromium.org>
> ---
>  arch/mips/kernel/reset.c | 20 ++++++++++++++++++++
>  1 file changed, 20 insertions(+)
> 
> diff --git a/arch/mips/kernel/reset.c b/arch/mips/kernel/reset.c
> index 07fc524..87b1f08 100644
> --- a/arch/mips/kernel/reset.c
> +++ b/arch/mips/kernel/reset.c
> @@ -29,16 +29,36 @@ void machine_restart(char *command)
>  {
>  	if (_machine_restart)
>  		_machine_restart(command);
> +
> +#ifdef CONFIG_SMP
> +	smp_send_stop();
> +#endif
> +	do_kernel_restart(command);
> +	pr_emerg("Reboot failed -- System halted\n");
> +	local_irq_disable();
> +	while (1);

 I think it would make sense to put WAIT or suchlike in the final loop 
so that such a halted system does not suck power unnecessarily.  I think 
bits in arch/mips/kernel/idle.c should do, after some massaging.  As the 
next step perhaps, don't treat it as a NACK for this change.

  Maciej

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] MIPS: Provide fallback reboot/poweroff/halt implementations
  2015-03-04 23:59 [PATCH] MIPS: Provide fallback reboot/poweroff/halt implementations Andrew Bresticker
  2015-03-06 11:08 ` Maciej W. Rozycki
@ 2015-03-24 14:22 ` James Hogan
  2015-03-24 16:30   ` Andrew Bresticker
  2015-03-25  6:12   ` Andrew Bresticker
  1 sibling, 2 replies; 5+ messages in thread
From: James Hogan @ 2015-03-24 14:22 UTC (permalink / raw)
  To: Andrew Bresticker, Ralf Baechle; +Cc: linux-mips, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 2017 bytes --]

Hi Andrew,

On 04/03/15 23:59, Andrew Bresticker wrote:
> If a machine-specific hook is not implemented for restart, poweroff,
> or halt, fall back to halting secondary CPUs, disabling interrupts,
> and spinning.  In the case of restart, attempt to restart the system
> via do_kernel_restart() (which will call any registered restart
> handlers) before halting.
> 
> Signed-off-by: Andrew Bresticker <abrestic@chromium.org>
> ---
>  arch/mips/kernel/reset.c | 20 ++++++++++++++++++++
>  1 file changed, 20 insertions(+)
> 
> diff --git a/arch/mips/kernel/reset.c b/arch/mips/kernel/reset.c
> index 07fc524..87b1f08 100644
> --- a/arch/mips/kernel/reset.c
> +++ b/arch/mips/kernel/reset.c
> @@ -29,16 +29,36 @@ void machine_restart(char *command)
>  {
>  	if (_machine_restart)
>  		_machine_restart(command);
> +
> +#ifdef CONFIG_SMP
> +	smp_send_stop();

Maybe local_irq_disable should be before smp_send_stop() to avoid
deadlocks (same below)?

See for example commit 44424c34049f41123a3a8b4853822f47f4ff03a2 ("ARM:
7803/1: Fix deadlock scenario with smp_send_stop()").

> +#endif
> +	do_kernel_restart(command);
> +	pr_emerg("Reboot failed -- System halted\n");

Perhaps we could have a grace period like ARM does here:

> /* Give a grace period for failure to restart of 1s */
> mdelay(1000);

Otherwise with this patch a reboot on Malta usually shows some/all of
this pr_emerg message prior to actually restarting. (Arguably thats a
failing of Malta's _machine_restart not to have a delay... thoughts?).

Cheers
James

> +	local_irq_disable();
> +	while (1);
>  }
>  
>  void machine_halt(void)
>  {
>  	if (_machine_halt)
>  		_machine_halt();
> +
> +#ifdef CONFIG_SMP
> +	smp_send_stop();
> +#endif
> +	local_irq_disable();
> +	while (1);
>  }
>  
>  void machine_power_off(void)
>  {
>  	if (pm_power_off)
>  		pm_power_off();
> +
> +#ifdef CONFIG_SMP
> +	smp_send_stop();
> +#endif
> +	local_irq_disable();
> +	while (1);
>  }
> 


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] MIPS: Provide fallback reboot/poweroff/halt implementations
  2015-03-24 14:22 ` James Hogan
@ 2015-03-24 16:30   ` Andrew Bresticker
  2015-03-25  6:12   ` Andrew Bresticker
  1 sibling, 0 replies; 5+ messages in thread
From: Andrew Bresticker @ 2015-03-24 16:30 UTC (permalink / raw)
  To: James Hogan; +Cc: Ralf Baechle, Linux-MIPS, linux-kernel@vger.kernel.org

Hi James,

On Tue, Mar 24, 2015 at 7:22 AM, James Hogan <james.hogan@imgtec.com> wrote:
> Hi Andrew,
>
> On 04/03/15 23:59, Andrew Bresticker wrote:
>> If a machine-specific hook is not implemented for restart, poweroff,
>> or halt, fall back to halting secondary CPUs, disabling interrupts,
>> and spinning.  In the case of restart, attempt to restart the system
>> via do_kernel_restart() (which will call any registered restart
>> handlers) before halting.
>>
>> Signed-off-by: Andrew Bresticker <abrestic@chromium.org>
>> ---
>>  arch/mips/kernel/reset.c | 20 ++++++++++++++++++++
>>  1 file changed, 20 insertions(+)
>>
>> diff --git a/arch/mips/kernel/reset.c b/arch/mips/kernel/reset.c
>> index 07fc524..87b1f08 100644
>> --- a/arch/mips/kernel/reset.c
>> +++ b/arch/mips/kernel/reset.c
>> @@ -29,16 +29,36 @@ void machine_restart(char *command)
>>  {
>>       if (_machine_restart)
>>               _machine_restart(command);
>> +
>> +#ifdef CONFIG_SMP
>> +     smp_send_stop();
>
> Maybe local_irq_disable should be before smp_send_stop() to avoid
> deadlocks (same below)?
>
> See for example commit 44424c34049f41123a3a8b4853822f47f4ff03a2 ("ARM:
> 7803/1: Fix deadlock scenario with smp_send_stop()").

Ah right, good catch.

>> +#endif
>> +     do_kernel_restart(command);
>> +     pr_emerg("Reboot failed -- System halted\n");
>
> Perhaps we could have a grace period like ARM does here:
>
>> /* Give a grace period for failure to restart of 1s */
>> mdelay(1000);
>
> Otherwise with this patch a reboot on Malta usually shows some/all of
> this pr_emerg message prior to actually restarting. (Arguably thats a
> failing of Malta's _machine_restart not to have a delay... thoughts?).

Yes, I think it's reasonable to put a delay here.

Thanks,
Andrew

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] MIPS: Provide fallback reboot/poweroff/halt implementations
  2015-03-24 14:22 ` James Hogan
  2015-03-24 16:30   ` Andrew Bresticker
@ 2015-03-25  6:12   ` Andrew Bresticker
  1 sibling, 0 replies; 5+ messages in thread
From: Andrew Bresticker @ 2015-03-25  6:12 UTC (permalink / raw)
  To: James Hogan; +Cc: Ralf Baechle, Linux-MIPS, linux-kernel@vger.kernel.org

On Tue, Mar 24, 2015 at 7:22 AM, James Hogan <james.hogan@imgtec.com> wrote:
> Hi Andrew,
>
> On 04/03/15 23:59, Andrew Bresticker wrote:
>> If a machine-specific hook is not implemented for restart, poweroff,
>> or halt, fall back to halting secondary CPUs, disabling interrupts,
>> and spinning.  In the case of restart, attempt to restart the system
>> via do_kernel_restart() (which will call any registered restart
>> handlers) before halting.
>>
>> Signed-off-by: Andrew Bresticker <abrestic@chromium.org>
>> ---
>>  arch/mips/kernel/reset.c | 20 ++++++++++++++++++++
>>  1 file changed, 20 insertions(+)
>>
>> diff --git a/arch/mips/kernel/reset.c b/arch/mips/kernel/reset.c
>> index 07fc524..87b1f08 100644
>> --- a/arch/mips/kernel/reset.c
>> +++ b/arch/mips/kernel/reset.c
>> @@ -29,16 +29,36 @@ void machine_restart(char *command)
>>  {
>>       if (_machine_restart)
>>               _machine_restart(command);
>> +
>> +#ifdef CONFIG_SMP
>> +     smp_send_stop();
>
> Maybe local_irq_disable should be before smp_send_stop() to avoid
> deadlocks (same below)?
>
> See for example commit 44424c34049f41123a3a8b4853822f47f4ff03a2 ("ARM:
> 7803/1: Fix deadlock scenario with smp_send_stop()").

Actually, disabling IRQs before calling smp_send_stop() triggers the
WARN in kernel/smp.c:smp_call_function_many(), but I think we can
simply disable preemption to prevent the deadlock.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2015-03-25  6:12 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-03-04 23:59 [PATCH] MIPS: Provide fallback reboot/poweroff/halt implementations Andrew Bresticker
2015-03-06 11:08 ` Maciej W. Rozycki
2015-03-24 14:22 ` James Hogan
2015-03-24 16:30   ` Andrew Bresticker
2015-03-25  6:12   ` Andrew Bresticker

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox