From eb0afe0902abb96a846beb05894a48862d5d2c91 Mon Sep 17 00:00:00 2001 From: Nicolas Vollmar Date: Wed, 11 Sep 2024 09:13:11 +0200 Subject: T6703: Adds option to configure AMD pstate driver (cherry picked from commit 333672bee041f0f2b8e1b698a8eb2108694ad812) --- interface-definitions/system_option.xml.in | 20 ++++++++++++++++++++ src/conf_mode/system_option.py | 14 ++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/interface-definitions/system_option.xml.in b/interface-definitions/system_option.xml.in index e78a53552..d15e391f5 100644 --- a/interface-definitions/system_option.xml.in +++ b/interface-definitions/system_option.xml.in @@ -49,6 +49,26 @@ + + + Enables and configures pstate driver for AMD Ryzen and Epyc CPUs + + active passive guided + + + active + This is the low-level firmware control mode based on the profile set and the system governor has no effect + + + passive + The driver allows the system governor to manage CPU frequency while providing available performance states + + + guided + The driver allows to set desired performance levels and the firmware selects a performance level in this range and fitting to the current workload + + + Dynamic debugging for kernel module diff --git a/src/conf_mode/system_option.py b/src/conf_mode/system_option.py index 6aaf3d107..8a49458eb 100755 --- a/src/conf_mode/system_option.py +++ b/src/conf_mode/system_option.py @@ -19,11 +19,13 @@ import os from sys import exit from time import sleep + from vyos.config import Config from vyos.configverify import verify_source_interface from vyos.configverify import verify_interface_exists from vyos.system import grub_util from vyos.template import render +from vyos.utils.cpu import get_cpus from vyos.utils.dict import dict_search from vyos.utils.file import write_file from vyos.utils.kernel import check_kmod @@ -94,6 +96,13 @@ def verify(options): if not is_intf_addr_assigned(interface, address): raise ConfigError(f'Address "{address}" not assigned on interface "{interface}"!') + if 'kernel' in options: + cpu_vendor = get_cpus()[0]['vendor_id'] + if 'amd_pstate_driver' in options['kernel'] and cpu_vendor != 'AuthenticAMD': + raise ConfigError( + f'AMD pstate driver cannot be used with "{cpu_vendor}" CPU!' + ) + return None def generate(options): @@ -107,6 +116,11 @@ def generate(options): cmdline_options.append('mitigations=off') if 'disable_power_saving' in options['kernel']: cmdline_options.append('intel_idle.max_cstate=0 processor.max_cstate=1') + if 'amd_pstate_driver' in options['kernel']: + mode = options['kernel']['amd_pstate_driver'] + cmdline_options.append( + f'initcall_blacklist=acpi_cpufreq_init amd_pstate={mode}' + ) grub_util.update_kernel_cmdline_options(' '.join(cmdline_options)) return None -- cgit v1.2.3 From 8a7f850a6023a0cb86631b5c049309ff0995001e Mon Sep 17 00:00:00 2001 From: Nicolas Vollmar Date: Wed, 11 Sep 2024 12:58:57 +0200 Subject: T6703: fix unrelated lint issues (cherry picked from commit f00d43381516326061db5287d841ad52e79d6271) --- src/conf_mode/system_option.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/conf_mode/system_option.py b/src/conf_mode/system_option.py index 8a49458eb..42c18142a 100755 --- a/src/conf_mode/system_option.py +++ b/src/conf_mode/system_option.py @@ -37,6 +37,7 @@ from vyos.configdep import set_dependents from vyos.configdep import call_dependents from vyos import ConfigError from vyos import airbag + airbag.enable() curlrc_config = r'/etc/curlrc' @@ -44,10 +45,8 @@ ssh_config = r'/etc/ssh/ssh_config.d/91-vyos-ssh-client-options.conf' systemd_action_file = '/lib/systemd/system/ctrl-alt-del.target' usb_autosuspend = r'/etc/udev/rules.d/40-usb-autosuspend.rules' kernel_dynamic_debug = r'/sys/kernel/debug/dynamic_debug/control' -time_format_to_locale = { - '12-hour': 'en_US.UTF-8', - '24-hour': 'en_GB.UTF-8' -} +time_format_to_locale = {'12-hour': 'en_US.UTF-8', '24-hour': 'en_GB.UTF-8'} + def get_config(config=None): if config: @@ -55,9 +54,9 @@ def get_config(config=None): else: conf = Config() base = ['system', 'option'] - options = conf.get_config_dict(base, key_mangling=('-', '_'), - get_first_key=True, - with_recursive_defaults=True) + options = conf.get_config_dict( + base, key_mangling=('-', '_'), get_first_key=True, with_recursive_defaults=True + ) if 'performance' in options: # Update IPv4/IPv6 and sysctl options after tuned applied it's settings @@ -66,6 +65,7 @@ def get_config(config=None): return options + def verify(options): if 'http_client' in options: config = options['http_client'] @@ -73,7 +73,9 @@ def verify(options): verify_interface_exists(options, config['source_interface']) if {'source_address', 'source_interface'} <= set(config): - raise ConfigError('Can not define both HTTP source-interface and source-address') + raise ConfigError( + 'Can not define both HTTP source-interface and source-address' + ) if 'source_address' in config: if not is_addr_assigned(config['source_address']): @@ -94,7 +96,9 @@ def verify(options): address = config['source_address'] interface = config['source_interface'] if not is_intf_addr_assigned(interface, address): - raise ConfigError(f'Address "{address}" not assigned on interface "{interface}"!') + raise ConfigError( + f'Address "{address}" not assigned on interface "{interface}"!' + ) if 'kernel' in options: cpu_vendor = get_cpus()[0]['vendor_id'] @@ -105,6 +109,7 @@ def verify(options): return None + def generate(options): render(curlrc_config, 'system/curlrc.j2', options) render(ssh_config, 'system/ssh_config.j2', options) @@ -125,6 +130,7 @@ def generate(options): return None + def apply(options): # System bootup beep beep_service = 'vyos-beep.service' @@ -163,7 +169,7 @@ def apply(options): if 'performance' in options: cmd('systemctl restart tuned.service') # wait until daemon has started before sending configuration - while (not is_systemd_service_running('tuned.service')): + while not is_systemd_service_running('tuned.service'): sleep(0.250) cmd('tuned-adm profile network-{performance}'.format(**options)) else: @@ -178,9 +184,9 @@ def apply(options): # Enable/diable root-partition-auto-resize SystemD service if 'root_partition_auto_resize' in options: - cmd('systemctl enable root-partition-auto-resize.service') + cmd('systemctl enable root-partition-auto-resize.service') else: - cmd('systemctl disable root-partition-auto-resize.service') + cmd('systemctl disable root-partition-auto-resize.service') # Time format 12|24-hour if 'time_format' in options: @@ -199,6 +205,7 @@ def apply(options): else: write_file(kernel_dynamic_debug, f'module {module} -p') + if __name__ == '__main__': try: c = get_config() -- cgit v1.2.3 From 52a298d64efbfb0c0a7e8893c164037fcbb10963 Mon Sep 17 00:00:00 2001 From: Nicolas Vollmar Date: Wed, 11 Sep 2024 14:40:38 +0200 Subject: T6703: shorten help description (cherry picked from commit 9fcf711e669f00df8313887a801130f4bb3826df) --- interface-definitions/system_option.xml.in | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface-definitions/system_option.xml.in b/interface-definitions/system_option.xml.in index d15e391f5..dc9958ff5 100644 --- a/interface-definitions/system_option.xml.in +++ b/interface-definitions/system_option.xml.in @@ -57,15 +57,15 @@ active - This is the low-level firmware control mode based on the profile set and the system governor has no effect + The firmware controls performance states and the system governor has no effect passive - The driver allows the system governor to manage CPU frequency while providing available performance states + Allow the system governor to manage performance states guided - The driver allows to set desired performance levels and the firmware selects a performance level in this range and fitting to the current workload + The firmware controls performance states guided by the system governor -- cgit v1.2.3