From: Russell King - ARM Linux <linux@arm.linux.org.uk>
To: Sebastian Capella <sebastian.capella@linaro.org>
Cc: Pavel Machek <pavel@ucw.cz>,
One Thousand Gnomes <gnomes@lxorguk.ukuu.org.uk>,
Linux Kernel <linux-kernel@vger.kernel.org>,
"linux-pm@vger.kernel.org" <linux-pm@vger.kernel.org>,
"linaro-kernel@lists.linaro.org" <linaro-kernel@lists.linaro.org>,
Len Brown <len.brown@intel.com>,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
Subject: Re: [PATCH RFC] PM / Hibernate: no kernel_power_off when pm_power_off NULL
Date: Wed, 16 Apr 2014 21:41:19 +0100 [thread overview]
Message-ID: <20140416204119.GJ24070@n2100.arm.linux.org.uk> (raw)
In-Reply-To: <CADHgK6vzagyELYGnVoHvfnK9G57-NSycOaKsNQ53rnU1pOwn=Q@mail.gmail.com>
On Wed, Apr 16, 2014 at 09:28:28AM -0700, Sebastian Capella wrote:
> On 15 April 2014 14:18, Pavel Machek <pavel@ucw.cz> 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.
next prev parent reply other threads:[~2014-04-16 20:42 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-20 20:53 [PATCH RFC 0/1] PM / Hibernate: no kernel_power_off when pm_power_off Sebastian Capella
2014-03-20 20:53 ` [PATCH RFC] PM / Hibernate: no kernel_power_off when pm_power_off NULL Sebastian Capella
2014-03-20 21:23 ` Pavel Machek
2014-03-20 21:35 ` One Thousand Gnomes
2014-03-20 21:36 ` Sebastian Capella
2014-03-26 17:22 ` Sebastian Capella
2014-04-15 18:34 ` Sebastian Capella
2014-04-15 20:54 ` Russell King - ARM Linux
2014-04-15 21:18 ` Pavel Machek
2014-04-16 16:28 ` Sebastian Capella
2014-04-16 20:41 ` Russell King - ARM Linux [this message]
2014-04-16 20:57 ` One Thousand Gnomes
2014-04-16 21:09 ` Russell King - ARM Linux
2014-04-18 21:38 ` Sebastian Capella
2014-04-20 14:06 ` Pavel Machek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140416204119.GJ24070@n2100.arm.linux.org.uk \
--to=linux@arm.linux.org.uk \
--cc=ezequiel.garcia@free-electrons.com \
--cc=gnomes@lxorguk.ukuu.org.uk \
--cc=len.brown@intel.com \
--cc=linaro-kernel@lists.linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=pavel@ucw.cz \
--cc=rjw@rjwysocki.net \
--cc=sebastian.capella@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®