All of lore.kernel.org
 help / color / mirror / Atom feed
From: "John B. Wyatt IV" <jwyatt@redhat.com>
To: "Francesco Poli (wintermute)" <invernomuto@paranoici.org>
Cc: linux-pm list <linux-pm@vger.kernel.org>,
	Thomas Renninger <trenn@suse.com>, Shuah Khan <shuah@kernel.org>,
	John Kacur <jkacur@redhat.com>
Subject: Re: [PATCH] cpupower: add a systemd service to run cpupower
Date: Mon, 21 Apr 2025 11:44:30 -0400	[thread overview]
Message-ID: <aAZn3rcwa5e-L68i@thinkpad2024> (raw)
In-Reply-To: <20250408203641.37195-1-invernomuto@paranoici.org>

Thank you for sending the patch Francesco.

There are several issues:

On Tue, Apr 08, 2025 at 10:32:46PM +0200, Francesco Poli (wintermute) wrote:
> One of the most typical use cases of the 'cpupower' utility works as
> follows: run 'cpupower' at boot with the desired command-line options
> and then forget about it.
> 
> Add a systemd service (disabled by default) that automates this use
> case (for environments where the initialization system is 'systemd'),
> by running 'cpupower' at boot with the settings read from a default
> configuration file.
> 
> The systemd service, the associated support script and the
> corresponding default configuration file are derived from what is
> provided by the Arch Linux package (under "GPL-2.0-or-later" terms),
> modernized and enhanced in various ways (the script has also been
> checked with 'shellcheck').
> 
> Link: https://gitlab.archlinux.org/archlinux/packaging/packages/linux-tools/-/tree/dd2e2a311e05413d0d87a0346ffce8c7e98d6d2b
> 
> Signed-off-by: Francesco Poli (wintermute) <invernomuto@paranoici.org>
> ---
>  tools/power/cpupower/Makefile            | 14 ++++++++++++
>  tools/power/cpupower/README              | 18 +++++++++++++++
>  tools/power/cpupower/cpupower.default    | 28 ++++++++++++++++++++++++
>  tools/power/cpupower/cpupower.service.in | 16 ++++++++++++++
>  tools/power/cpupower/cpupower.sh         | 26 ++++++++++++++++++++++
>  5 files changed, 102 insertions(+)
>  create mode 100644 tools/power/cpupower/cpupower.default
>  create mode 100644 tools/power/cpupower/cpupower.service.in
>  create mode 100644 tools/power/cpupower/cpupower.sh
> 
> diff --git a/tools/power/cpupower/Makefile b/tools/power/cpupower/Makefile
> index 51a95239fe06..2bdfb2bfe88a 100644
> --- a/tools/power/cpupower/Makefile
> +++ b/tools/power/cpupower/Makefile
> @@ -2,6 +2,7 @@
>  # Makefile for cpupower
>  #
>  # Copyright (C) 2005,2006 Dominik Brodowski <linux@dominikbrodowski.net>
> +# Copyright (C) 2025      Francesco Poli <invernomuto@paranoici.org>
>  #
>  # Based largely on the Makefile for udev by:
>  #
> @@ -68,6 +69,7 @@ bindir ?=	/usr/bin
>  sbindir ?=	/usr/sbin
>  mandir ?=	/usr/man
>  libdir ?=	/usr/lib
> +libexecdir ?=	/usr/libexec
>  includedir ?=	/usr/include
>  localedir ?=	/usr/share/locale
>  docdir ?=       /usr/share/doc/packages/cpupower
> @@ -80,6 +82,7 @@ CP = cp -fpR
>  INSTALL = /usr/bin/install -c
>  INSTALL_PROGRAM = ${INSTALL}
>  INSTALL_DATA  = ${INSTALL} -m 644
> +SETPERM_DATA  = chmod 644
>  #bash completion scripts get sourced and so they should be rw only.
>  INSTALL_SCRIPT = ${INSTALL} -m 644
>  
> @@ -299,6 +302,14 @@ install-tools: $(OUTPUT)cpupower
>  	$(INSTALL_PROGRAM) $(OUTPUT)cpupower $(DESTDIR)${bindir}
>  	$(INSTALL) -d $(DESTDIR)${bash_completion_dir}
>  	$(INSTALL_SCRIPT) cpupower-completion.sh '$(DESTDIR)${bash_completion_dir}/cpupower'
> +	$(INSTALL) -d $(DESTDIR)${confdir}default
> +	$(INSTALL_DATA) cpupower.default '$(DESTDIR)${confdir}default/cpupower'
> +	$(INSTALL) -d $(DESTDIR)${libexecdir}
> +	$(INSTALL_PROGRAM) cpupower.sh '$(DESTDIR)${libexecdir}/cpupower'
> +	$(INSTALL) -d $(DESTDIR)${libdir}/systemd/system
> +	sed 's|___CDIR___|$(DESTDIR)${confdir}|; s|___LDIR___|$(DESTDIR)${libexecdir}|' cpupower.service.in > '$(DESTDIR)${libdir}/systemd/system/cpupower.service'
> +	$(SETPERM_DATA) '$(DESTDIR)${libdir}/systemd/system/cpupower.service'
> +	if test -d /run/systemd/system; then systemctl daemon-reload; fi
>  
>  install-man:
>  	$(INSTALL_DATA) -D man/cpupower.1 $(DESTDIR)${mandir}/man1/cpupower.1
> @@ -333,6 +344,9 @@ uninstall:
>  	- rm -f $(DESTDIR)${includedir}/cpufreq.h
>  	- rm -f $(DESTDIR)${includedir}/cpuidle.h
>  	- rm -f $(DESTDIR)${bindir}/utils/cpupower
> +	- rm -f $(DESTDIR)${confdir}default/cpupower
> +	- rm -f $(DESTDIR)${libexecdir}/cpupower
> +	- rm -f $(DESTDIR)${libdir}/systemd/system/cpupower.service
>  	- rm -f $(DESTDIR)${mandir}/man1/cpupower.1
>  	- rm -f $(DESTDIR)${mandir}/man1/cpupower-frequency-set.1
>  	- rm -f $(DESTDIR)${mandir}/man1/cpupower-frequency-info.1
> diff --git a/tools/power/cpupower/README b/tools/power/cpupower/README
> index 2678ed81d311..3c34ef67e0cf 100644
> --- a/tools/power/cpupower/README
> +++ b/tools/power/cpupower/README
> @@ -59,6 +59,10 @@ $ sudo make install
>  -----------------------------------------------------------------------
>  | man pages              | /usr/man                                   |
>  -----------------------------------------------------------------------
> +| systemd service        | /usr/lib                                   |
> +-----------------------------------------------------------------------
> +| systemd support script | /usr/libexec                               |
> +-----------------------------------------------------------------------
>  
>  To put it in other words it makes build results available system-wide,
>  enabling any user to simply start using it without any additional steps
> @@ -109,6 +113,10 @@ The files will be installed to the following dirs:
>  -----------------------------------------------------------------------
>  | man pages              | ${DESTDIR}/usr/man                         |
>  -----------------------------------------------------------------------
> +| systemd service        | ${DESTDIR}/usr/lib                         |
> +-----------------------------------------------------------------------
> +| systemd support script | ${DESTDIR}/usr/libexec                     |
> +-----------------------------------------------------------------------
>  
>  If you look at the table for the default 'make' output dirs you will
>  notice that the only difference with the non-default case is the
> @@ -173,6 +181,16 @@ The issue is that binary cannot find the 'libcpupower' library. So, we
>  shall point to the lib dir:
>  sudo LD_LIBRARY_PATH=lib64/ ./bin/cpupower
>  
> +systemd service
> +---------------
> +
> +A systemd service is also provided to run the cpupower utility at boot with
> +settings read from a configuration file. In order to enable this systemd
> +service, edit '${DESTDIR}/etc/default/cpupower' and then issue the following
> +command:

Edit what? What should they change?

I am new to systemd files so knowing how to test this is important.

> +
> +$ sudo systemctl enable --now cpupower.service
> +
>  
>  THANKS
>  ------
> diff --git a/tools/power/cpupower/cpupower.default b/tools/power/cpupower/cpupower.default
> new file mode 100644
> index 000000000000..b2fd3c37e277
> --- /dev/null
> +++ b/tools/power/cpupower/cpupower.default
> @@ -0,0 +1,28 @@
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# Copyright (C) 2012, Sébastien Luttringer
> +# Copyright (C) 2024, Francesco Poli <invernomuto@paranoici.org>
> +
> +# defaults file for linux-cpupower

Should be:

# Default file for linux-cpupower

Otherwise, the additional comments added to the Arch files are welcome.
:)

> +
> +# --- CPU clock frequency ---
> +
> +# Define CPU governor
> +# valid governors: ondemand, performance, powersave, conservative, userspace.

Since we are at proofreading; please capitalize valid.

> +#GOVERNOR='ondemand'

One thing I noticed is that you changed the variables to their
uppercase. Is there a reason for that? Have you tested it?

Last you wrote, you copied the Arch files to test in Debian. Once again,
not familiar with systemd files so this is a change.

> +
> +# Limit frequency range
> +# Valid suffixes: Hz, kHz (default), MHz, GHz, THz
> +#MIN_FREQ="2.25GHz"
> +#MAX_FREQ="3GHz"
> +
> +# Specific frequency to be set.
> +# Requires userspace governor to be available.
> +# If this option is set, all the previous frequency options are ignored
> +#FREQ=
> +
> +# --- CPU policy ---
> +
> +# Sets a register on supported Intel processore which allows software to convey
> +# its policy for the relative importance of performance versus energy savings to
> +# the  processor. See man (1) CPUPOWER-SET for additional details.

double space

> +#PERF_BIAS=
> diff --git a/tools/power/cpupower/cpupower.service.in b/tools/power/cpupower/cpupower.service.in
> new file mode 100644
> index 000000000000..f91eaed03872
> --- /dev/null
> +++ b/tools/power/cpupower/cpupower.service.in
> @@ -0,0 +1,16 @@
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# Copyright (C) 2012-2020, Sébastien Luttringer
> +# Copyright (C) 2024, Francesco Poli <invernomuto@paranoici.org>
> +
> +[Unit]
> +Description=Apply cpupower configuration
> +ConditionVirtualization=!container
> +
> +[Service]
> +Type=oneshot
> +EnvironmentFile=-___CDIR___default/cpupower
> +ExecStart=___LDIR___/cpupower
> +RemainAfterExit=yes
> +
> +[Install]
> +WantedBy=multi-user.target
> diff --git a/tools/power/cpupower/cpupower.sh b/tools/power/cpupower/cpupower.sh
> new file mode 100644
> index 000000000000..a37dd4cfdb2b
> --- /dev/null
> +++ b/tools/power/cpupower/cpupower.sh
> @@ -0,0 +1,26 @@
> +#!/bin/sh
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# Copyright (C) 2012, Sébastien Luttringer
> +# Copyright (C) 2024, Francesco Poli <invernomuto@paranoici.org>
> +
> +ESTATUS=0
> +
> +# apply CPU clock frequency options
> +if test -n "$FREQ"
> +then
> +    cpupower frequency-set -f "$FREQ" > /dev/null || ESTATUS=1
> +elif test -n "${GOVERNOR}${MIN_FREQ}${MAX_FREQ}"
> +then
> +    cpupower frequency-set \
> +      ${GOVERNOR:+ -g "$GOVERNOR"} \
> +      ${MIN_FREQ:+ -d "$MIN_FREQ"} ${MAX_FREQ:+ -u "$MAX_FREQ"} \
> +      > /dev/null || ESTATUS=1
> +fi
> +
> +# apply CPU policy options
> +if test -n "$PERF_BIAS"
> +then
> +    cpupower set -b "$PERF_BIAS" > /dev/null || ESTATUS=1
> +fi
> +
> +exit $ESTATUS

Where did you get this file? I do not believe I see it in the Arch
package repo. What is it used for with the systemd scripts? They do not
reference it.

https://gitlab.archlinux.org/archlinux/packaging/packages/linux-tools/-/tree/main?ref_type=heads

> 
> base-commit: a64dcfb451e254085a7daee5fe51bf22959d52d3
> -- 
> 2.47.2
> 

Just got back from PTO so may have more comments later.

-- 
Sincerely,
John Wyatt
Software Engineer, Core Kernel
Red Hat


  reply	other threads:[~2025-04-21 15:48 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-08 20:32 [PATCH] cpupower: add a systemd service to run cpupower Francesco Poli (wintermute)
2025-04-21 15:44 ` John B. Wyatt IV [this message]
2025-04-25 15:06   ` Francesco Poli

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=aAZn3rcwa5e-L68i@thinkpad2024 \
    --to=jwyatt@redhat.com \
    --cc=invernomuto@paranoici.org \
    --cc=jkacur@redhat.com \
    --cc=linux-pm@vger.kernel.org \
    --cc=shuah@kernel.org \
    --cc=trenn@suse.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.