summaryrefslogtreecommitdiff
path: root/src/conf_mode/vpp.py
diff options
context:
space:
mode:
authorNataliia Solomko <natalirs1985@gmail.com>2026-04-14 18:07:41 +0300
committerNataliia Solomko <natalirs1985@gmail.com>2026-04-21 16:45:43 +0300
commit9cb6f4c001fa5d4f4ed26850fc99dde4c3692c8f (patch)
tree5309c08fd789a8560426c1d45e45050c1ad8ac22 /src/conf_mode/vpp.py
parentd9c7cf3bc0e76661f48bd0ce13acfc7be182a326 (diff)
downloadvyos-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-xsrc/conf_mode/vpp.py33
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):