Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

T6703: Adds option to configure AMD pstate driver #4046

Merged
merged 3 commits into from
Sep 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions interface-definitions/system_option.xml.in
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,26 @@
<valueless/>
</properties>
</leafNode>
<leafNode name="amd-pstate-driver">
<properties>
<help>Enables and configures pstate driver for AMD Ryzen and Epyc CPUs</help>
<completionHelp>
<list>active passive guided</list>
</completionHelp>
<valueHelp>
<format>active</format>
<description>The firmware controls performance states and the system governor has no effect</description>
</valueHelp>
<valueHelp>
<format>passive</format>
<description>Allow the system governor to manage performance states</description>
</valueHelp>
<valueHelp>
<format>guided</format>
<description>The firmware controls performance states guided by the system governor</description>
</valueHelp>
</properties>
</leafNode>
<node name="debug">
<properties>
<help>Dynamic debugging for kernel module</help>
Expand Down
45 changes: 33 additions & 12 deletions src/conf_mode/system_option.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@
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
Expand All @@ -35,27 +37,26 @@
from vyos.configdep import call_dependents
from vyos import ConfigError
from vyos import airbag

airbag.enable()

curlrc_config = r'/etc/curlrc'
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:
conf = config
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
Expand All @@ -64,14 +65,17 @@ def get_config(config=None):

return options


def verify(options):
if 'http_client' in options:
config = options['http_client']
if 'source_interface' in config:
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']):
Expand All @@ -92,10 +96,20 @@ 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']
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):
render(curlrc_config, 'system/curlrc.j2', options)
render(ssh_config, 'system/ssh_config.j2', options)
Expand All @@ -107,10 +121,16 @@ 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


def apply(options):
# System bootup beep
beep_service = 'vyos-beep.service'
Expand Down Expand Up @@ -149,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:
Expand All @@ -164,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:
Expand All @@ -186,6 +206,7 @@ def apply(options):
else:
write_file(kernel_dynamic_debug, f'module {module} -p')


if __name__ == '__main__':
try:
c = get_config()
Expand Down
Loading