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 4bmhkB4bcSz309Y for ; Tue, 22 Jul 2025 15:57:54 +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) client-signature RSA-PSS (4096 bits)) (Client CN "mail01.haj.ipfire.org", Issuer "R11" (verified OK)) by mail02.haj.ipfire.org (Postfix) with ESMTPS id 4bmhk70ZDHz2xSN for ; Tue, 22 Jul 2025 15:57:51 +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 4bmhk62gJMz2k3; Tue, 22 Jul 2025 15:57:50 +0000 (UTC) DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=ipfire.org; s=202003ed25519; t=1753199870; 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=qYXbqO2Tey9M3TW4GtEiZds2kHviOFO6Cbae7tXEFq8=; b=VtBwrzBBaKvQUgg31aF4zojARx3kGq2IJXEnUgtx/6cterNce07/3JLkIrUs7xfsieh7ip Y40CbDa2aYsCnlDw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ipfire.org; s=202003rsa; t=1753199870; 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=qYXbqO2Tey9M3TW4GtEiZds2kHviOFO6Cbae7tXEFq8=; b=mC18TArES13m14mxXQPfnXxAjsvl3LYpKZAuZuq+eII9niBtOyg6J8ikO920Htd77feIX1 ipeKS5vKuaFdTfCJtR+yd529DVVyv2LhvdmzIbV8s2dqyhcXpPSZeoKuZGed6QKCUD1Lgp KX0iWwMYigEG2IY8emOOQgpYtDci7J4iw70NdPYGK28vh/aSInZQ+4xUY71IxxX2adoThA HTfqdTNKfg83utV2jnvMXs4fn2X/M7ApuOpH8R6BN0a6j8ambarLXKQnKR0WswwGIxJszE GoCc6KspwVB3yYLnBuPVTimKn7aLJ4SBAu5xqtssd3cEEGrsryI5UMebQre/9A== Content-Type: text/plain; charset=utf-8 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: <508a03f7-2a59-4769-a029-875eedaed62c@yahoo.com> Date: Tue, 22 Jul 2025 16:57:50 +0100 Cc: murphy.jon@me.com, development@lists.ipfire.org Content-Transfer-Encoding: quoted-printable Message-Id: <7091A0AC-1543-46FB-B84C-C76F2C32EF03@ipfire.org> References: <20250717173032.3442618-1-michael.tremer@ipfire.org> <3bf7411d-ad0b-43af-97c8-ab70342d9a46@yahoo.com> <49E27F13-2E7D-40C4-9C8D-5BB066BCFA85@ipfire.org> <508a03f7-2a59-4769-a029-875eedaed62c@yahoo.com> To: Charles Brown Thank you Jon for creating the wiki page. I don=E2=80=99t think that people will generally have to change this. = This is either if the default setting is causing crashes or for testing. -Michael > On 21 Jul 2025, at 21:31, Charles Brown wrote: >=20 > Hi Jon, I am perfectly satisfied with Michael's default = implementation in src/initscripts/system/cpupower. > I see no personal need to override that in |/etc/sysconfig/cpupower.| > -cab >=20 > On 7/21/2025 2:15 PM, murphy.jon@me.com wrote: >> I added a wiki page: >>=20 >>>> Just curious about find_governor() ... how/where would the variable = "GOVERNOR" be getting configured? >>=20 >> Charles - If/when you make a change, please add your changes to the = above Wiki page as an example. >>=20 >>=20 >> Jon >>=20 >>=20 >>> On Jul 21, 2025, at 4:10=E2=80=AFAM, Michael Tremer = wrote: >>>=20 >>> Hello Charles, >>>=20 >>> Thanks for your question. >>>=20 >>> 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. >>>=20 >>> -Michael >>>=20 >>>> 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 >>>=20 >>>=20 >>=20 >> Jon >>=20 >>=20 >> --=20 >> Jon Murphy >> murphy.jon@me.com >>=20 >=20