2014-04-15 18:34:55

by Sebastian Capella

[permalink] [raw]
Subject: Re: [PATCH RFC] PM / Hibernate: no kernel_power_off when pm_power_off NULL

Ping..

There appears to be disagreement on the correct path to take on this.

Pavel and Alan recommend that arm's machine_power_off shall never return

Russell suggests hibernation be modified to handle machine_power_off
returning; that x86 architecture (and others as well) can have
machine_power_off returning.

Discussions available at the links below:
https://lkml.org/lkml/2014/3/25/554 -- linux-arm discussion
https://lkml.org/lkml/2014/3/20/649 -- linux-pm discussion

Should I continue with the original hibernation patch from the
linux-pm discussion?

Does anyone have any response to Russel's commentsl?

Thanks!

Sebastian


2014-04-15 20:55:39

by Russell King - ARM Linux

[permalink] [raw]
Subject: Re: [PATCH RFC] PM / Hibernate: no kernel_power_off when pm_power_off NULL

On Tue, Apr 15, 2014 at 11:34:52AM -0700, Sebastian Capella wrote:
> Ping..
>
> There appears to be disagreement on the correct path to take on this.
>
> Pavel and Alan recommend that arm's machine_power_off shall never return
>
> Russell suggests hibernation be modified to handle machine_power_off
> returning; that x86 architecture (and others as well) can have
> machine_power_off returning.
>
> Discussions available at the links below:
> https://lkml.org/lkml/2014/3/25/554 -- linux-arm discussion
> https://lkml.org/lkml/2014/3/20/649 -- linux-pm discussion
>
> Should I continue with the original hibernation patch from the
> linux-pm discussion?
>
> Does anyone have any response to Russel's commentsl?

What I'm basically saying is that I see no reason for ARM to do something
different to what x86 does.

What is pretty clear to me is that ARM is compatible with x86, which is
compatible with kernel/reboot.c, and it's the hibernate code which is
the odd one out.

--
FTTC broadband for 0.8mile line: now at 9.7Mbps down 460kbps up... slowly
improving, and getting towards what was expected from it.

2014-04-15 21:18:55

by Pavel Machek

[permalink] [raw]
Subject: Re: [PATCH RFC] PM / Hibernate: no kernel_power_off when pm_power_off NULL

On Tue 2014-04-15 21:54:53, Russell King - ARM Linux wrote:
> On Tue, Apr 15, 2014 at 11:34:52AM -0700, Sebastian Capella wrote:
> > Ping..
> >
> > There appears to be disagreement on the correct path to take on this.
> >
> > Pavel and Alan recommend that arm's machine_power_off shall never return
> >
> > Russell suggests hibernation be modified to handle machine_power_off
> > returning; that x86 architecture (and others as well) can have
> > machine_power_off returning.
> >
> > Discussions available at the links below:
> > https://lkml.org/lkml/2014/3/25/554 -- linux-arm discussion
> > https://lkml.org/lkml/2014/3/20/649 -- linux-pm discussion
> >
> > Should I continue with the original hibernation patch from the
> > linux-pm discussion?
> >
> > Does anyone have any response to Russel's commentsl?
>
> What I'm basically saying is that I see no reason for ARM to do something
> different to what x86 does.
>
> What is pretty clear to me is that ARM is compatible with x86, which is
> compatible with kernel/reboot.c, and it's the hibernate code which is
> the odd one out.

I'm pretty sure the original code did not return. Anyway, the best
solution, given how many platforms are out there, would be to

a) document that it should not return

b) fix hibernation to handle the returning case, anyway.

Pavel
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

2014-04-16 16:28:32

by Sebastian Capella

[permalink] [raw]
Subject: Re: [PATCH RFC] PM / Hibernate: no kernel_power_off when pm_power_off NULL

On 15 April 2014 14:18, Pavel Machek <[email protected]> wrote:
> On Tue 2014-04-15 21:54:53, Russell King - ARM Linux wrote:
>> What I'm basically saying is that I see no reason for ARM to do something
>> different to what x86 does.
>>
>> What is pretty clear to me is that ARM is compatible with x86, which is
>> compatible with kernel/reboot.c, and it's the hibernate code which is
>> the odd one out.
>
> I'm pretty sure the original code did not return. Anyway, the best
> solution, given how many platforms are out there, would be to
>
> a) document that it should not return
>
> b) fix hibernation to handle the returning case, anyway.

Thanks Russell and Pavel!

This sounds fine to me. Any objections?

Thanks!

Sebastian

2014-04-16 20:42:11

by Russell King - ARM Linux

[permalink] [raw]
Subject: Re: [PATCH RFC] PM / Hibernate: no kernel_power_off when pm_power_off NULL

On Wed, Apr 16, 2014 at 09:28:28AM -0700, Sebastian Capella wrote:
> On 15 April 2014 14:18, Pavel Machek <[email protected]> wrote:
> > On Tue 2014-04-15 21:54:53, Russell King - ARM Linux wrote:
> >> What I'm basically saying is that I see no reason for ARM to do something
> >> different to what x86 does.
> >>
> >> What is pretty clear to me is that ARM is compatible with x86, which is
> >> compatible with kernel/reboot.c, and it's the hibernate code which is
> >> the odd one out.
> >
> > I'm pretty sure the original code did not return. Anyway, the best
> > solution, given how many platforms are out there, would be to
> >
> > a) document that it should not return
> >
> > b) fix hibernation to handle the returning case, anyway.
>
> Thanks Russell and Pavel!
>
> This sounds fine to me. Any objections?

Here is the i386 code from 2.2.20:

void machine_halt(void)
{
}

void machine_power_off(void)
{
if (acpi_power_off)
acpi_power_off();
}

Both can return. On the other hand, machine_restart() can never return as
the final attempt to perform that action in machine_real_restart is a jump
to 16-bit code.

2.4 kernels then modified it to this:

void machine_halt(void)
{
}

void machine_power_off(void)
{
if (pm_power_off)
pm_power_off();
}

with machine_restart() doing similar to v2.2.

2.6.0 also did the same as 2.4 kernels. 2.6.16 then changed to this:

void machine_restart(char * __unused)
{
machine_shutdown();
machine_emergency_restart();
}

void machine_halt(void)
{
}

void machine_power_off(void)
{
if (pm_power_off) {
machine_shutdown();
pm_power_off();
}
}

which starts adding some extra stuff into the power off hook - but
again, it's a no-op unless the pm_power_off function pointer is
initialised.

Today, it's:

void machine_power_off(void)
{
machine_ops.power_off();
}

which calls native_power_off():

static void native_machine_power_off(void)
{
if (pm_power_off) {
if (!reboot_force)
machine_shutdown();
pm_power_off();
}
/* A fallback in case there is no PM info available */
tboot_shutdown(TB_SHUTDOWN_HALT);
}

and tboot_shutdown():

void tboot_shutdown(u32 shutdown_type)
{
void (*shutdown)(void);

if (!tboot_enabled())
return;

so it's entirely possible today for machine_power_off() on x86 to return.

So... the i386 code has had this "machine_power_off() can return"
behaviour for a significant number of years and persists to this day.

I'd say scrap (a) _unless_ we're going to add while (1) loops to all
the architectures. Alternatively, we could just accept that
machine_power_off() may return and deal with that case (iow, not
crash) in generic code.

--
FTTC broadband for 0.8mile line: now at 9.7Mbps down 460kbps up... slowly
improving, and getting towards what was expected from it.

2014-04-16 20:57:45

by Alan Cox

[permalink] [raw]
Subject: Re: [PATCH RFC] PM / Hibernate: no kernel_power_off when pm_power_off NULL

> I'd say scrap (a) _unless_ we're going to add while (1) loops to all
> the architectures. Alternatively, we could just accept that
> machine_power_off() may return and deal with that case (iow, not
> crash) in generic code.

What would the right behaviour be

while(1);

isn't really nice behaviour on a modern device

2014-04-16 21:09:47

by Russell King - ARM Linux

[permalink] [raw]
Subject: Re: [PATCH RFC] PM / Hibernate: no kernel_power_off when pm_power_off NULL

On Wed, Apr 16, 2014 at 09:57:18PM +0100, One Thousand Gnomes wrote:
> > I'd say scrap (a) _unless_ we're going to add while (1) loops to all
> > the architectures. Alternatively, we could just accept that
> > machine_power_off() may return and deal with that case (iow, not
> > crash) in generic code.
>
> What would the right behaviour be
>
> while(1);
>
> isn't really nice behaviour on a modern device

That's an entirely different question... one which also needs fixing
in the hibernate code. We already know that cpu_relax() in there is
a good thing to do, so that would be a good start.

--
FTTC broadband for 0.8mile line: now at 9.7Mbps down 460kbps up... slowly
improving, and getting towards what was expected from it.

2014-04-18 21:38:44

by Sebastian Capella

[permalink] [raw]
Subject: Re: [PATCH RFC] PM / Hibernate: no kernel_power_off when pm_power_off NULL

Thanks Russell, Alan!

So we're OK with the current patch + replacing while(1) after
kernel_halt at the end of power_down in hibernate.c with a while (1)
cpu_relax()?

Any other changes needed?

If not, I'll send a follow up patch with just these.

Thanks!

Sebastian

2014-04-20 14:06:24

by Pavel Machek

[permalink] [raw]
Subject: Re: [PATCH RFC] PM / Hibernate: no kernel_power_off when pm_power_off NULL

On Fri 2014-04-18 14:38:34, Sebastian Capella wrote:
> Thanks Russell, Alan!
>
> So we're OK with the current patch + replacing while(1) after
> kernel_halt at the end of power_down in hibernate.c with a while (1)
> cpu_relax()?
>
> Any other changes needed?
>
> If not, I'll send a follow up patch with just these.

That sounds like a plan. Thanks.
Pavel
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html