From 9c066c03863fbf05865f32b1e49b01308802da67 Mon Sep 17 00:00:00 2001 From: Peter Reichart Date: Sun, 29 Jun 2025 11:21:45 +0000 Subject: [PATCH] Dateien nach "/" hochladen --- System cost comparison.ods | Bin 0 -> 67562 bytes autoaspm.py | 114 +++++++++++++++++++++++++++++++++++++ check_aspm.sh | 5 ++ init.sh | 6 ++ turbostat.sh | 5 ++ 5 files changed, 130 insertions(+) create mode 100644 System cost comparison.ods create mode 100644 autoaspm.py create mode 100644 check_aspm.sh create mode 100644 init.sh create mode 100644 turbostat.sh diff --git a/System cost comparison.ods b/System cost comparison.ods new file mode 100644 index 0000000000000000000000000000000000000000..0c5523d85152ce73bb3255b8ce8c8c2927dc4dd4 GIT binary patch literal 67562 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�|G)3=zQ6Z% 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 0: + raise Exception("lspci not detected. Please install pciutils") + lspci_detected = subprocess.run(["which", "setpci"], stdout = subprocess.DEVNULL, stderr = subprocess.DEVNULL) + if lspci_detected.returncode > 0: + raise Exception("setpci not detected. Please install pciutils") + + +def get_device_name(addr): + p = subprocess.Popen([ + "lspci", + "-s", + addr, + ], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return p.communicate()[0].splitlines()[0].decode() + +def read_all_bytes(device): + all_bytes = bytearray() + device_name = get_device_name(device) + p = subprocess.Popen([ + "lspci", + "-s", + device, + "-xxx" + ], stdout= subprocess.PIPE, stderr=subprocess.PIPE) + ret = p.communicate() + ret = ret[0].decode() + for line in ret.splitlines(): + if not device_name in line and ": " in line: + all_bytes.extend(bytearray.fromhex(line.split(": ")[1])) + if len(all_bytes) < 256: + exit() + return all_bytes + +def find_byte_to_patch(bytes, pos): + pos = bytes[pos] + if bytes[pos] != 0x10: + pos += 0x1 + return find_byte_to_patch(bytes, pos) + else: + pos += 0x10 + return pos + +def patch_byte(device, position, value): + subprocess.Popen([ + "setpci", + "-s", + device, + f"{hex(position)}.B={hex(value)}" + ]).communicate() + +def patch_device(addr, aspm_value): + endpoint_bytes = read_all_bytes(addr) + byte_position_to_patch = find_byte_to_patch(endpoint_bytes, 0x34) + if int(endpoint_bytes[byte_position_to_patch]) & 0b11 != aspm_value.value: + patched_byte = int(endpoint_bytes[byte_position_to_patch]) + patched_byte = patched_byte >> 2 + patched_byte = patched_byte << 2 + patched_byte = patched_byte | aspm_value.value + + patch_byte(addr, byte_position_to_patch, patched_byte) + print(f"{addr}: Enabled ASPM {aspm_value.name}") + else: + print(f"{addr}: Already has ASPM {aspm_value.name} enabled") + + +def list_supported_devices(): + pcie_addr_regex = r"([0-9a-f]{2}:[0-9a-f]{2}\.[0-9a-f])" + lspci = subprocess.run("lspci -vv", shell=True, capture_output=True).stdout + lspci_arr = re.split(pcie_addr_regex, str(lspci))[1:] + lspci_arr = [ x+y for x,y in zip(lspci_arr[0::2], lspci_arr[1::2]) ] + + aspm_devices = {} + for dev in lspci_arr: + device_addr = re.findall(pcie_addr_regex, dev)[0] + if "ASPM" not in dev or "ASPM not supported" in dev: + continue + aspm_support = re.findall(r"ASPM (L[L0-1s ]*),", dev) + if aspm_support: + aspm_devices.update({device_addr: ASPM[aspm_support[0].replace(" ", "")]}) + return aspm_devices + + +def main(): + run_prerequisites() + for device, aspm_mode in list_supported_devices().items(): + patch_device(device, aspm_mode) + +if __name__ == "__main__": + main() diff --git a/check_aspm.sh b/check_aspm.sh new file mode 100644 index 0000000..f571608 --- /dev/null +++ b/check_aspm.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +lspci -vv | awk '/ASPM/{print $0}' RS= | grep --color -P '(^[a-z0-9:.]+|ASPM )' + + diff --git a/init.sh b/init.sh new file mode 100644 index 0000000..b2418e1 --- /dev/null +++ b/init.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +apt install -y powertop linux-cpupower +./autoaspm.py +./check_aspm.sh +powertop --auto-tune diff --git a/turbostat.sh b/turbostat.sh new file mode 100644 index 0000000..62b404a --- /dev/null +++ b/turbostat.sh @@ -0,0 +1,5 @@ +#!/binsh + +turbostat --Summary -quiet --show PkgWatt --interval 1 + +