diff options
| author | Nataliia Solomko <natalirs1985@gmail.com> | 2026-04-14 18:07:41 +0300 |
|---|---|---|
| committer | Nataliia Solomko <natalirs1985@gmail.com> | 2026-04-21 16:45:43 +0300 |
| commit | 9cb6f4c001fa5d4f4ed26850fc99dde4c3692c8f (patch) | |
| tree | 5309c08fd789a8560426c1d45e45050c1ad8ac22 /src/conf_mode/vpp.py | |
| parent | d9c7cf3bc0e76661f48bd0ce13acfc7be182a326 (diff) | |
| download | vyos-1x-9cb6f4c001fa5d4f4ed26850fc99dde4c3692c8f.tar.gz vyos-1x-9cb6f4c001fa5d4f4ed26850fc99dde4c3692c8f.zip | |
vpp: T8460: Use isolated cpus for VPP cpu-cores
VPP CPU core assignment now uses kernel-isolated CPUs (from /sys/devices/system/cpu/isolated) with explicit corelist-workers instead of computing offsets from available cores with skip-cores/workers. Added validation that enough CPUs are actually isolated before VPP starts, and that isolate-cpus config only references existing CPU IDs. Moved smoketest for kernel option 'isolate-cpus' to test_vpp.py
Diffstat (limited to 'src/conf_mode/vpp.py')
| -rwxr-xr-x | src/conf_mode/vpp.py | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/src/conf_mode/vpp.py b/src/conf_mode/vpp.py index 33a4023af..342d58fca 100755 --- a/src/conf_mode/vpp.py +++ b/src/conf_mode/vpp.py @@ -38,8 +38,10 @@ from vyos.ifconfig import Section from vyos.logger import getLogger from vyos.template import render from vyos.utils.boot import boot_configuration_complete -from vyos.utils.cpu import get_available_cpus +from vyos.utils.convert import range_str_to_list +from vyos.utils.convert import list_to_range_str from vyos.utils.dict import dict_search +from vyos.utils.file import read_file from vyos.utils.kernel import check_kmod from vyos.utils.kernel import unload_kmod from vyos.utils.kernel import list_loaded_modules @@ -62,7 +64,6 @@ from vyos.vpp.config_verify import ( verify_vpp_buffers, ) from vyos.vpp.config_resource_checks import memory -from vyos.vpp.config_resource_checks.resource_defaults import default_resource_map from vyos.vpp.config_filter import iface_filter_eth from vyos.vpp.utils import EthtoolGDrvinfo from vyos.vpp.utils import cli_ethernet_with_vifs_ifaces @@ -168,21 +169,27 @@ def _unload_module(module_name: str): def _configure_vpp_cpu_settings(config: dict): - """Configure VPP CPU settings: main-core, workers and skip-cores based on 'cpu-cores'""" + """Configure VPP CPU settings: main-core and corelist-workers based on 'cpu-cores'. + + Reads the actually-isolated CPUs from the running kernel + (/sys/devices/system/cpu/isolated) and assigns: + - main_core: the first isolated CPU (index 0) + - corelist_workers: the next (cpu_cores - 1) isolated CPUs + """ cpu_cores = int(config['settings']['resource_allocation']['cpu_cores']) - reserved_cpus = default_resource_map.get('reserved_cpu_cores') + # Use the system's actual isolated CPUs, not config values which may + # require a reboot to take effect + isolated = read_file('/sys/devices/system/cpu/isolated') + cpus_isolated = range_str_to_list(isolated) - # Get sorted list of available CPU IDs - available = sorted({cpu['cpu'] for cpu in get_available_cpus()}) + if cpu_cores <= len(cpus_isolated): + # First isolated CPU is the VPP main thread; remaining are workers + config['settings']['cpu'] = {'main_core': str(cpus_isolated[0])} - if reserved_cpus < len(available): - main_core = available[reserved_cpus] # first non-reserved CPU - config['settings']['cpu'] = { - 'main_core': str(main_core), - 'skip_cores': str(reserved_cpus), - } if cpu_cores > 1: - config['settings']['cpu']['workers'] = str(cpu_cores - 1) + config['settings']['cpu']['corelist_workers'] = list_to_range_str( + cpus_isolated[1:cpu_cores] + ) def _normalize_buffers(config: dict): |
