From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.haj.ipfire.org (localhost [127.0.0.1]) by mail02.haj.ipfire.org (Postfix) with ESMTP id 4blvl90zSyz2ywD for ; Mon, 21 Jul 2025 09:11:01 +0000 (UTC) Received: from mail01.ipfire.org (mail01.haj.ipfire.org [172.28.1.202]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mail01.haj.ipfire.org", Issuer "R11" (verified OK)) by mail02.haj.ipfire.org (Postfix) with ESMTPS id 4blvl542QXz2yWW for ; Mon, 21 Jul 2025 09:10:57 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail01.ipfire.org (Postfix) with ESMTPSA id 4blvl44JzJz1Fd; Mon, 21 Jul 2025 09:10:56 +0000 (UTC) DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=ipfire.org; s=202003ed25519; t=1753089056; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/LTpk9auilZ5ZtmOGsjE3B7JoDfYii9zRGPvyIgl/Wc=; b=kCt8szfTHIQnhoxxFAY6bWBUHozH4adUqPel3rvWPCU3UE2Ay71o5SHZxVgKXeXHt2Jzh3 j+SaH1dDDWdtRyDg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ipfire.org; s=202003rsa; t=1753089056; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/LTpk9auilZ5ZtmOGsjE3B7JoDfYii9zRGPvyIgl/Wc=; b=dhR+PgOVrpJoTUnngPj5CSa2dRvgC1OOmu9JAzx1GmYiPb9UyFv4+yur+TxaZZ0tOHE5Os 6BqPydO722Ug45HYoZm3bz4BrHxlqHW7+reEy2MKO8KYuYSxOhcbdb+inZJWkH5jnOWwPC ZVKdJ0FnD1LTi0Wg8+AF0G+TOGs1fjWFWGJi3i2wffpvZe/7oGqFdyrdV34mcHhlcEVnP8 F8/YIKRINY9wb7Z3es6g8YBGiIr9Kqzokz5LWbtG6XRBLsh3oUFGPLpoxoN7FGNSFcGZyo cyamrU9GrEHfdP+rQ20YO+0hqP0tIrc+SvPhoNAyRhOwcbsu6HqKeDvALxBnxw== Content-Type: text/plain; charset=us-ascii Precedence: list List-Id: List-Subscribe: , List-Unsubscribe: , List-Post: List-Help: Sender: Mail-Followup-To: Mime-Version: 1.0 Subject: Re: [PATCH 1/3] initscripts: Automatically enable CPU power saving features From: Michael Tremer In-Reply-To: <3bf7411d-ad0b-43af-97c8-ab70342d9a46@yahoo.com> Date: Mon, 21 Jul 2025 10:10:56 +0100 Cc: development@lists.ipfire.org Content-Transfer-Encoding: quoted-printable Message-Id: <49E27F13-2E7D-40C4-9C8D-5BB066BCFA85@ipfire.org> References: <20250717173032.3442618-1-michael.tremer@ipfire.org> <3bf7411d-ad0b-43af-97c8-ab70342d9a46@yahoo.com> To: Charles Brown Hello Charles, Thanks for your question. The variable is by default not set. But at the top of the file, we = optionally load a configuration file. So if someone wants to hard-code a = custom governor (even if it is just for testing), they can set the = variable in /etc/sysconfig/cpupower. -Michael > On 20 Jul 2025, at 15:05, Charles Brown wrote: >=20 > Just curious about find_governor() ... how/where would the variable = "GOVERNOR" be getting configured? >=20 > On 7/17/2025 12:30 PM, Michael Tremer wrote: >> This is a cleaned up implementation of the script that was previously >> packaged in the cpufrequtils package. >>=20 >> Signed-off-by: Michael Tremer >> --- >> config/rootfiles/common/aarch64/initscripts | 2 + >> config/rootfiles/common/riscv64/initscripts | 2 + >> config/rootfiles/common/x86_64/initscripts | 2 + >> lfs/initscripts | 1 + >> src/initscripts/system/cpupower | 89 = +++++++++++++++++++++ >> 5 files changed, 96 insertions(+) >> create mode 100644 src/initscripts/system/cpupower >>=20 >> diff --git a/config/rootfiles/common/aarch64/initscripts = b/config/rootfiles/common/aarch64/initscripts >> index 1fd1f076f..fa43d4fe1 100644 >> --- a/config/rootfiles/common/aarch64/initscripts >> +++ b/config/rootfiles/common/aarch64/initscripts >> @@ -18,6 +18,7 @@ etc/rc.d/init.d/collectd >> etc/rc.d/init.d/connectd >> etc/rc.d/init.d/conntrackd >> etc/rc.d/init.d/console >> +etc/rc.d/init.d/cpupower >> etc/rc.d/init.d/dhcp >> etc/rc.d/init.d/dhcrelay >> etc/rc.d/init.d/fcron >> @@ -183,6 +184,7 @@ etc/rc.d/rcsysinit.d/S42fsresize >> etc/rc.d/rcsysinit.d/S43mounttmpfs >> etc/rc.d/rcsysinit.d/S44smt >> etc/rc.d/rcsysinit.d/S45udev_retry >> +etc/rc.d/rcsysinit.d/S46cpupower >> etc/rc.d/rcsysinit.d/S50cleanfs >> etc/rc.d/rcsysinit.d/S60setclock >> etc/rc.d/rcsysinit.d/S70console >> diff --git a/config/rootfiles/common/riscv64/initscripts = b/config/rootfiles/common/riscv64/initscripts >> index 694207257..a31359134 100644 >> --- a/config/rootfiles/common/riscv64/initscripts >> +++ b/config/rootfiles/common/riscv64/initscripts >> @@ -18,6 +18,7 @@ etc/rc.d/init.d/collectd >> etc/rc.d/init.d/connectd >> etc/rc.d/init.d/conntrackd >> etc/rc.d/init.d/console >> +etc/rc.d/init.d/cpupower >> etc/rc.d/init.d/dhcp >> etc/rc.d/init.d/dhcrelay >> etc/rc.d/init.d/fcron >> @@ -182,6 +183,7 @@ etc/rc.d/rcsysinit.d/S42fsresize >> etc/rc.d/rcsysinit.d/S43mounttmpfs >> etc/rc.d/rcsysinit.d/S44smt >> etc/rc.d/rcsysinit.d/S45udev_retry >> +etc/rc.d/rcsysinit.d/S46cpupower >> etc/rc.d/rcsysinit.d/S50cleanfs >> etc/rc.d/rcsysinit.d/S60setclock >> etc/rc.d/rcsysinit.d/S70console >> diff --git a/config/rootfiles/common/x86_64/initscripts = b/config/rootfiles/common/x86_64/initscripts >> index 694207257..a31359134 100644 >> --- a/config/rootfiles/common/x86_64/initscripts >> +++ b/config/rootfiles/common/x86_64/initscripts >> @@ -18,6 +18,7 @@ etc/rc.d/init.d/collectd >> etc/rc.d/init.d/connectd >> etc/rc.d/init.d/conntrackd >> etc/rc.d/init.d/console >> +etc/rc.d/init.d/cpupower >> etc/rc.d/init.d/dhcp >> etc/rc.d/init.d/dhcrelay >> etc/rc.d/init.d/fcron >> @@ -182,6 +183,7 @@ etc/rc.d/rcsysinit.d/S42fsresize >> etc/rc.d/rcsysinit.d/S43mounttmpfs >> etc/rc.d/rcsysinit.d/S44smt >> etc/rc.d/rcsysinit.d/S45udev_retry >> +etc/rc.d/rcsysinit.d/S46cpupower >> etc/rc.d/rcsysinit.d/S50cleanfs >> etc/rc.d/rcsysinit.d/S60setclock >> etc/rc.d/rcsysinit.d/S70console >> diff --git a/lfs/initscripts b/lfs/initscripts >> index 99fe2f1be..49215c0ae 100644 >> --- a/lfs/initscripts >> +++ b/lfs/initscripts >> @@ -176,6 +176,7 @@ $(TARGET) : >> ln -sf ../init.d/mounttmpfs /etc/rc.d/rcsysinit.d/S43mounttmpfs >> ln -sf ../init.d/smt /etc/rc.d/rcsysinit.d/S44smt >> ln -sf ../init.d/udev_retry /etc/rc.d/rcsysinit.d/S45udev_retry >> + ln -sf ../init.d/cpupower /etc/rc.d/rcsysinit.d/S46cpupower >> ln -sf ../init.d/cleanfs /etc/rc.d/rcsysinit.d/S50cleanfs >> ln -sf ../init.d/setclock /etc/rc.d/rcsysinit.d/S60setclock >> ln -sf ../init.d/console /etc/rc.d/rcsysinit.d/S70console >> diff --git a/src/initscripts/system/cpupower = b/src/initscripts/system/cpupower >> new file mode 100644 >> index 000000000..82b62a89b >> --- /dev/null >> +++ b/src/initscripts/system/cpupower >> @@ -0,0 +1,89 @@ >> +#!/bin/sh >> = +#########################################################################= ###### >> +# = # >> +# IPFire.org - A linux based firewall = # >> +# Copyright (C) 2025 IPFire Team = # >> +# = # >> +# This program is free software: you can redistribute it and/or = modify # >> +# it under the terms of the GNU General Public License as published = by # >> +# the Free Software Foundation, either version 3 of the License, or = # >> +# (at your option) any later version. = # >> +# = # >> +# This program is distributed in the hope that it will be useful, = # >> +# but WITHOUT ANY WARRANTY; without even the implied warranty of = # >> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the = # >> +# GNU General Public License for more details. = # >> +# = # >> +# You should have received a copy of the GNU General Public License = # >> +# along with this program. If not, see = . # >> +# = # >> = +#########################################################################= ###### >> + >> +. /etc/sysconfig/rc >> +. ${rc_functions} >> + >> +# Load the configuration if it exists >> +if [ -r "/etc/sysconfig/cpupower" ]; then >> + . /etc/sysconfig/cpupower >> +fi >> + >> +# This function returns which governor to use >> +find_governor() { >> + local driver >> + >> + # If a governor has been configured, we just use that one >> + if [ -n "${GOVERNOR}" ]; then >> + echo "${GOVERNOR}" >> + return 0 >> + fi >> + >> + # Determine the driver >> + if [ -r "/sys/devices/system/cpu/cpu0/cpufreq/scaling_driver" ]; = then >> + driver=3D"$(> + fi >> + >> + # Decide which governor to use based on the driver >> + case "${driver}" in >> + # If the driver could not be detected, we won't use anything >> + "") >> + ;; >> + >> + # Intel P-State only supports performace and powersave. The latter >> + # is rather implemented like ondemand in other cases. >> + intel_pstate) >> + echo "powersave" >> + ;; >> + >> + # For everything else use schedutil >> + *) >> + echo "schedutil" >> + ;; >> + esac >> + >> + return 0 >> +} >> + >> +set_governor() { >> + # Find the governor to use >> + local governor=3D"$(find_governor)" >> + >> + # If we could not detect a governor we don't have anything to do >> + if [ -z "${governor}" ]; then >> + return 0 >> + fi >> + >> + # Set the governor >> + cpupower frequency-set --governor "${governor}" >/dev/null >> +} >> + >> +case "${1}" in >> + start) >> + boot_mesg "Enabling CPU Power Saving Features..." >> + set_governor >> + evaluate_retval >> + ;; >> + *) >> + echo "Usage: ${0} {start}" >> + exit 1 >> + ;; >> +esac >=20