[systemd-devel] [PATCH] Support system freeze

Lennart Poettering lennart at poettering.net
Fri Mar 1 03:55:01 PST 2013


On Thu, 28.02.13 22:22, Cristian Rodríguez (crrodriguez at opensuse.org) wrote:

> As implemented in kernel 3.9
> 
>
>http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=commit;h=7e73c5ae6e7991a6c01f6d096ff8afaef4458c36

Hmm, I am pretty sure we want to support this with the same scheme as
the "standby" mode: i.e. instead of defining a new high-level verb for
it, simply make this configurable as cmdline param to systemd-sleep, and
also have an automatic logic in place that on "suspend" tries STR first, and
if that's not available falls back to "standby", and if that's not
available tries "freeze". 

This is being discussed here:

https://bugs.freedesktop.org/show_bug.cgi?id=57793

> ---
>  Makefile.am                     |  2 ++
>  man/systemd-suspend.service.xml | 19 ++++++++++++++-----
>  src/sleep/sleep.c               |  8 ++++++++
>  units/freeze.target             | 13 +++++++++++++
>  units/systemd-freeze.service.in | 17 +++++++++++++++++
>  5 files changed, 54 insertions(+), 5 deletions(-)
>  create mode 100644 units/freeze.target
>  create mode 100644 units/systemd-freeze.service.in
> 
> diff --git a/Makefile.am b/Makefile.am
> index d00ca11..b540b12 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -359,6 +359,7 @@ dist_systemunit_DATA = \
>  	units/sleep.target \
>  	units/sockets.target \
>  	units/suspend.target \
> +	units/freeze.target \
>  	units/swap.target \
>  	units/systemd-initctl.socket \
>  	units/systemd-shutdownd.socket \
> @@ -452,6 +453,7 @@ EXTRA_DIST += \
>  	units/systemd-hibernate.service.in \
>  	units/systemd-hybrid-sleep.service.in \
>  	units/systemd-suspend.service.in \
> +	units/systemd-freeze.service.in \
>  	units/quotaon.service.in \
>  	introspect.awk \
>  	man/custom-html.xsl
> diff --git a/man/systemd-suspend.service.xml b/man/systemd-suspend.service.xml
> index 9b8bad4..97806d5 100644
> --- a/man/systemd-suspend.service.xml
> +++ b/man/systemd-suspend.service.xml
> @@ -46,6 +46,7 @@
>                  <refname>systemd-suspend.service</refname>
>                  <refname>systemd-hibernate.service</refname>
>                  <refname>systemd-hybrid-sleep.service</refname>
> +                <refname>systemd-freeze.service</refname>
>                  <refname>systemd-sleep</refname>
>                  <refpurpose>System sleep state logic</refpurpose>
>          </refnamediv>
> @@ -54,6 +55,7 @@
>                  <para><filename>systemd-suspend.service</filename></para>
>                  <para><filename>systemd-hibernate.service</filename></para>
>                  <para><filename>systemd-hybrid-sleep.service</filename></para>
> +                <para><filename>systemd-freeze.service</filename></para>
>                  <para><filename>/usr/lib/systemd/systemd-sleep</filename></para>
>          </refsynopsisdiv>
>  
> @@ -66,11 +68,14 @@
>                  for the actual system suspend. Similar,
>                  <filename>systemd-hibernate.service</filename> is
>                  pulled in by <filename>hibernate.target</filename> to
> -                execute the actual hibernation. Finally,
> +                execute the actual hibernation.
>                  <filename>systemd-hybrid-sleep.service</filename> is
>                  pulled in by <filename>hybrid-sleep.target</filename>
>                  to execute hybrid hibernation with system
> -                suspend.</para>
> +                suspend.
> +                <filename>systemd-freeze.service</filename> is
> +                pulled in by <filename>freeze.target</filename>
> +                to execute a system freeze.</para>
>  
>                  <para>Immediately before entering system suspend
>                  and/or hibernation
> @@ -81,8 +86,9 @@
>                  and pass two arguments to them. The first argument
>                  will be "<literal>pre</literal>", the second either
>                  "<literal>suspend</literal>",
> -                "<literal>hibernate</literal>", or
> -                "<literal>hybrid-sleep</literal>" depending on the
> +                "<literal>hibernate</literal>",
> +                "<literal>hybrid-sleep</literal>" or
> +                "<literal>freeze</literal>" depending on the
>                  chosen action. Immediately after leaving system
>                  suspend and/or hibernation the same executables are run,
>                  but the first argument is now
> @@ -100,7 +106,8 @@
>  
>                  <para>Note that
>                  <filename>systemd-suspend.service</filename>,
> -                <filename>systemd-hibernate.service</filename> and
> +                <filename>systemd-hibernate.service</filename>,
> +                <filename>systemd-freeze.service</filename> and
>                  <filename>systemd-hybrid-sleep.service</filename>
>                  should never be executed directly. Instead, trigger
>                  system sleep states with a command such as
> @@ -111,6 +118,8 @@
>                  <literal>mem</literal> into
>                  <filename>/sys/power/state</filename>, to trigger the
>                  actual system suspend.</para>
> +
> +                <para>System freeze is only supported in kernel 3.9 or later.</para>
>          </refsect1>
>  
>          <refsect1>
> diff --git a/src/sleep/sleep.c b/src/sleep/sleep.c
> index 0707625..a80f3fb 100644
> --- a/src/sleep/sleep.c
> +++ b/src/sleep/sleep.c
> @@ -49,6 +49,8 @@ int main(int argc, char *argv[]) {
>                  verb = "mem";
>          else if (streq(argv[1], "hibernate") || streq(argv[1], "hybrid-sleep"))
>                  verb = "disk";
> +        else if(streq(argv[1], "freeze"))
> +                verb = "freeze";
>          else {
>                  log_error("Unknown action '%s'.", argv[1]);
>                  r = -EINVAL;
> @@ -90,6 +92,12 @@ int main(int argc, char *argv[]) {
>                             "MESSAGE=Hibernating system...",
>                             "SLEEP=hibernate",
>                             NULL);
> +        else if (streq(argv[1], "freeze"))
> +                log_struct(LOG_INFO,
> +                           MESSAGE_ID(SD_MESSAGE_SLEEP_START),
> +                           "MESSAGE=Freezing system...",
> +                           "SLEEP=freeze",
> +                           NULL);
>          else
>                  log_struct(LOG_INFO,
>                             MESSAGE_ID(SD_MESSAGE_SLEEP_START),
> diff --git a/units/freeze.target b/units/freeze.target
> new file mode 100644
> index 0000000..5bd0bd7
> --- /dev/null
> +++ b/units/freeze.target
> @@ -0,0 +1,13 @@
> +#  This file is part of systemd.
> +#
> +#  systemd is free software; you can redistribute it and/or modify it
> +#  under the terms of the GNU Lesser General Public License as published by
> +#  the Free Software Foundation; either version 2.1 of the License, or
> +#  (at your option) any later version.
> +
> +[Unit]
> +Description=Freeze
> +Documentation=man:systemd.special(7)
> +DefaultDependencies=no
> +RefuseManualStart=yes
> +StopWhenUnneeded=yes
> diff --git a/units/systemd-freeze.service.in b/units/systemd-freeze.service.in
> new file mode 100644
> index 0000000..842d7cf
> --- /dev/null
> +++ b/units/systemd-freeze.service.in
> @@ -0,0 +1,17 @@
> +#  This file is part of systemd.
> +#
> +#  systemd is free software; you can redistribute it and/or modify it
> +#  under the terms of the GNU Lesser General Public License as published by
> +#  the Free Software Foundation; either version 2.1 of the License, or
> +#  (at your option) any later version.
> +
> +[Unit]
> +Description=Freeze
> +Documentation=man:systemd-suspend.service(8)
> +DefaultDependencies=no
> +Requires=freeze.target
> +After=freeze.target
> +
> +[Service]
> +Type=oneshot
> +ExecStart=@rootlibexecdir@/systemd-sleep freeze


Lennart

-- 
Lennart Poettering - Red Hat, Inc.


More information about the systemd-devel mailing list