add experimental code to test rw msr capabilities

move every instance of lenovo_fix to throttled
This commit is contained in:
erpalma 2021-10-30 12:05:48 +02:00
parent 6219a9ed4a
commit 392f3f8ab9
8 changed files with 74 additions and 27 deletions

View file

@ -1,41 +1,54 @@
#!/bin/sh
INSTALL_DIR="/opt/lenovo_fix"
LEGACY_INSTALL_DIR="/opt/lenovo_fix"
INSTALL_DIR="/opt/throttled"
if pidof systemd 2>&1 1>/dev/null; then
systemctl stop lenovo_fix.service >/dev/null 2>&1
systemctl stop throttled.service >/dev/null 2>&1
elif pidof runit 2>&1 1>/dev/null; then
sv down lenovo_fix >/dev/null 2>&1
sv down throttled >/dev/null 2>&1
elif pidof openrc 2>&1 1>/dev/null; then
rc-service lenovo_fix stop >/dev/null 2>&1
rc-service throttled stop >/dev/null 2>&1
fi
mv "$LEGACY_INSTALL_DIR" "$INSTALL_DIR" >/dev/null 2>&1
rm "$INSTALL_DIR/lenovo_fix.py" >/dev/null 2>&1
mkdir -p "$INSTALL_DIR" >/dev/null 2>&1
set -e
cd "$(dirname "$0")"
if [ -f /etc/lenovo_fix.conf ]; then
echo "Updating config filename"
mv etc/lenovo_fix.conf /etc/throttled.conf
fi
echo "Copying config file"
if [ ! -f /etc/lenovo_fix.conf ]; then
cp etc/lenovo_fix.conf /etc
if [ ! -f /etc/throttled.conf ]; then
cp etc/throttled.conf /etc
else
echo "Config file already exists, skipping"
fi
if pidof systemd 2>&1 1>/dev/null; then
echo "Copying systemd service file"
cp systemd/lenovo_fix.service /etc/systemd/system
cp systemd/throttled.service /etc/systemd/system
rm /etc/systemd/system/lenovo_fix.service >/dev/null 2>&1
elif pidof runit 2>&1 1>/dev/null; then
echo "Copying runit service file"
cp -R runit/lenovo_fix /etc/sv/
cp -R runit/throttled /etc/sv/
rm -r /etc/sv/lenovo_fix >/dev/null 2>&1
elif pidof openrc-init 2>&1 1>/dev/null; then
echo "Copying OpenRC service file"
cp -R openrc/lenovo_fix /etc/init.d/lenovo_fix
chmod 755 /etc/init.d/lenovo_fix
cp -R openrc/throttled /etc/init.d/throttled
rm /etc/init.d/lenovo_fix >/dev/null 2>&1
chmod 755 /etc/init.d/throttled
fi
echo "Copying core files"
cp requirements.txt lenovo_fix.py mmio.py "$INSTALL_DIR"
cp requirements.txt throttled.py mmio.py "$INSTALL_DIR"
echo "Building virtualenv"
cd "$INSTALL_DIR"
/usr/bin/python3 -m venv venv
@ -46,16 +59,16 @@ pip install -r requirements.txt
if pidof systemd 2>&1 1>/dev/null; then
echo "Enabling and starting systemd service"
systemctl daemon-reload
systemctl enable lenovo_fix.service
systemctl restart lenovo_fix.service
systemctl enable throttled.service
systemctl restart throttled.service
elif pidof runit 2>&1 1>/dev/null; then
echo "Enabling and starting runit service"
ln -sv /etc/sv/lenovo_fix /var/service/
sv up lenovo_fix
ln -sv /etc/sv/throttled /var/service/
sv up throttled
elif pidof openrc-init 2>&1 1>/dev/null; then
echo "Enabling and starting OpenRC service"
rc-update add lenovo_fix default
rc-service lenovo_fix start
rc-update add throttled default
rc-service throttled start
fi
echo "All done."

View file

@ -1,5 +0,0 @@
#!/usr/bin/openrc-run
command="env python3 /usr/lib/throttled/lenovo_fix.py"
pidfile=${pidfile-/var/run/lenovo_fix.pid}
description="Stop Intel throttling"
command_background="yes"

5
openrc/throttled Normal file
View file

@ -0,0 +1,5 @@
#!/usr/bin/openrc-run
command="env python3 /usr/lib/throttled/throttled.py"
pidfile=${pidfile-/var/run/throttled.pid}
description="Stop Intel throttling"
command_background="yes"

View file

@ -1,2 +0,0 @@
#!/bin/sh
PYTHONUNBUFFERED=1 exec /opt/lenovo_fix/venv/bin/python3 /opt/lenovo_fix/lenovo_fix.py

2
runit/throttled/run Executable file
View file

@ -0,0 +1,2 @@
#!/bin/sh
PYTHONUNBUFFERED=1 exec /opt/throttled/venv/bin/python3 /opt/throttled/throttled.py

View file

@ -3,7 +3,7 @@ Description=Stop Intel throttling
[Service]
Type=simple
ExecStart=/opt/lenovo_fix/venv/bin/python3 /opt/lenovo_fix/lenovo_fix.py
ExecStart=/opt/throttled/venv/bin/python3 /opt/throttled/throttled.py
# Setting PYTHONUNBUFFERED is necessary to see the output of this service in the journal
Environment=PYTHONUNBUFFERED=1

View file

@ -165,6 +165,9 @@ supported_cpus = {
(6, 167, 1): 'RocketLake',
}
TESTMSR = False
UNSUPPORTED_FEATURES = []
class bcolors:
YELLOW = '\033[93m'
@ -221,6 +224,8 @@ def writemsr(msr, val):
os.write(f, struct.pack('Q', val))
os.close(f)
except (IOError, OSError) as e:
if TESTMSR:
raise e
if e.errno == EPERM or e.errno == EACCES:
fatal(
'Unable to write to MSR {} ({:x}). Try to disable Secure Boot '
@ -257,6 +262,8 @@ def readmsr(msr, from_bit=0, to_bit=63, cpu=None, flatten=False):
return output[0]
return output[cpu] if cpu is not None else output
except (IOError, OSError) as e:
if TESTMSR:
raise e
if e.errno == EPERM or e.errno == EACCES:
fatal('Unable to read from MSR {} ({:x}). Try to disable Secure Boot.'.format(msr, MSR_DICT[msr]))
elif e.errno == EIO:
@ -394,6 +401,8 @@ def calc_undervolt_mv(msr_value):
def get_undervolt(plane=None, convert=False):
if 'UNDERVOLT' in UNSUPPORTED_FEATURES:
return 0
planes = [plane] if plane in VOLTAGE_PLANES else VOLTAGE_PLANES
out = {}
for plane in planes:
@ -405,7 +414,9 @@ def get_undervolt(plane=None, convert=False):
def undervolt(config):
if 'UNDERVOLT.{:s}'.format(power['source']) not in config and 'UNDERVOLT' not in config:
if ('UNDERVOLT.{:s}'.format(power['source']) not in config and 'UNDERVOLT' not in config) or (
'UNDERVOLT' in UNSUPPORTED_FEATURES
):
return
for plane in VOLTAGE_PLANES:
write_offset_mv = config.getfloat(
@ -624,11 +635,11 @@ def calc_reg_values(platform_info, config):
def set_hwp(performance_mode):
if performance_mode is None:
if performance_mode not in (True, False) or 'HWP' in UNSUPPORTED_FEATURES:
return
# set HWP energy performance preference
cur_val = readmsr('IA32_HWP_REQUEST', cpu=0)
hwp_mode = HWP_PERFORMANCE_VALUE if performance_mode else HWP_DEFAULT_VALUE
hwp_mode = HWP_PERFORMANCE_VALUE if performance_mode is True else HWP_DEFAULT_VALUE
new_val = (cur_val & 0xFFFFFFFF00FFFFFF) | (hwp_mode << 24)
writemsr('IA32_HWP_REQUEST', new_val)
@ -699,7 +710,7 @@ def power_thread(config, regs, exit_event):
power['source'] = 'BATTERY' if is_on_battery(config) else 'AC'
# set temperature trip point
if 'MSR_TEMPERATURE_TARGET' in regs[power['source']]:
if 's' in regs[power['source']]:
write_value = regs[power['source']]['MSR_TEMPERATURE_TARGET']
writemsr('MSR_TEMPERATURE_TARGET', write_value)
if args.debug:
@ -834,6 +845,27 @@ def check_cpu():
fatal('Unable to identify CPU model.')
def test_msr_rw_capabilities():
TESTMSR = True
try:
log('[I] Testing if undervolt is supported...')
get_undervolt()
except:
warning('Undervolt seems not to be supported by your system, disabling.')
UNSUPPORTED_FEATURES.append('UNDERVOLT')
try:
log('[I] Testing if HWP is supported...')
cur_val = readmsr('IA32_HWP_REQUEST', cpu=0)
writemsr('IA32_HWP_REQUEST', cur_val)
except:
warning('HWP seems not to be supported by your system, disabling.')
UNSUPPORTED_FEATURES.append('HWP')
TESTMSR = False
def monitor(exit_event, wait):
wait = max(0.1, wait)
rapl_power_unit = 0.5 ** readmsr('MSR_RAPL_POWER_UNIT', from_bit=8, to_bit=12, cpu=0)
@ -896,7 +928,7 @@ def main():
nargs='?',
help='realtime monitoring of throttling causes (default 1s)',
)
parser.add_argument('--config', default='/etc/lenovo_fix.conf', help='override default config file path')
parser.add_argument('--config', default='/etc/throttled.conf', help='override default config file path')
parser.add_argument('--force', action='store_true', help='bypass compatibility checks (EXPERTS only)')
parser.add_argument('--log', metavar='/path/to/file', help='log to file instead of stdout')
args = parser.parse_args()
@ -914,6 +946,8 @@ def main():
set_msr_allow_writes()
test_msr_rw_capabilities()
log('[I] Loading config file.')
config = load_config()
power['source'] = 'BATTERY' if is_on_battery(config) else 'AC'