summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorViacheslav Hletenko <v.gletenko@vyos.io>2026-02-17 16:05:48 +0200
committerGitHub <noreply@github.com>2026-02-17 16:05:48 +0200
commit9785f396ba1e82b6b359e42af7da03828b4ff6ed (patch)
tree3ca807b3c1210e871fca08c10f167be751c16e7c /src
parent33752c9a41f2e79c1ef3884188968d0f48bc79d8 (diff)
parent2414c156cc21bfe51b65f8726f186c55b533bb97 (diff)
downloadvyos-1x-9785f396ba1e82b6b359e42af7da03828b4ff6ed.tar.gz
vyos-1x-9785f396ba1e82b6b359e42af7da03828b4ff6ed.zip
Merge pull request #4993 from natali-rs1985/T8268
vpp: T8268: Unify CPU settings into a single 'cpu-cores' node under 'resource-allocation'
Diffstat (limited to 'src')
-rwxr-xr-xsrc/conf_mode/vpp.py81
-rw-r--r--src/migration-scripts/vpp/7-to-835
2 files changed, 66 insertions, 50 deletions
diff --git a/src/conf_mode/vpp.py b/src/conf_mode/vpp.py
index 2634eae44..c961132d8 100755
--- a/src/conf_mode/vpp.py
+++ b/src/conf_mode/vpp.py
@@ -35,6 +35,7 @@ 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.kernel import check_kmod
from vyos.utils.kernel import unload_kmod
from vyos.utils.kernel import list_loaded_modules
@@ -49,11 +50,7 @@ from vyos.vpp.config_verify import (
verify_dev_driver,
verify_vpp_minimum_cpus,
verify_vpp_minimum_memory,
- verify_vpp_settings_cpu,
- verify_vpp_settings_cpu_corelist_workers,
- verify_vpp_cpu_main_core,
- verify_vpp_settings_cpu_skip_cores,
- verify_vpp_settings_cpu_workers,
+ verify_vpp_cpu_cores,
verify_vpp_memory,
verify_vpp_statseg_size,
verify_vpp_interfaces_dpdk_num_queues,
@@ -62,6 +59,7 @@ 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.configdb import JSONStorage
@@ -152,25 +150,28 @@ def _unload_module(module_name: str):
raise
-def _get_workers_count(cpu_settings: dict) -> int:
- if 'corelist_workers' in cpu_settings:
- corelist_workers = []
- for worker_range in cpu_settings['corelist_workers']:
- core_numbers = worker_range.split('-')
- corelist_workers.extend(
- range(int(core_numbers[0]), int(core_numbers[-1]) + 1)
- )
+def _configure_vpp_cpu_settings(config: dict):
+ """Configure VPP CPU settings: main-core, workers and skip-cores based on 'cpu-cores'"""
+ cpu_cores = int(config['settings']['resource_allocation']['cpu_cores'])
+ reserved_cpus = default_resource_map.get('reserved_cpu_cores')
- return len(corelist_workers)
+ # Get sorted list of available CPU IDs
+ available = sorted({cpu['cpu'] for cpu in get_available_cpus()})
- return int(cpu_settings.get('workers', 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)
def _normalize_buffers(config: dict):
"""Replace 'auto' buffers_per_numa with calculated value"""
if config['settings']['buffers']['buffers_per_numa'] == 'auto':
- workers = _get_workers_count(config['settings'].get('cpu', {}))
- buffers = memory.buffers_required(config['settings'], workers)
+ buffers = memory.buffers_required(config['settings'])
config['settings']['buffers']['buffers_per_numa'] = str(buffers)
@@ -398,15 +399,18 @@ def get_config(config=None):
)
if 'zero-copy' in iface_config['xdp_options']:
xdp_api_params['mode'] = 'zero-copy'
- if iface_config.get('rx_mode') in ('interrupt', 'adaptive') and any(
- key in config['settings'].get('cpu', {})
- for key in ('workers', 'corelist_workers')
+ if (
+ iface_config.get('rx_mode') in ('interrupt', 'adaptive')
+ and int(config['settings']['resource_allocation']['cpu_cores'])
+ > 1
):
xdp_api_params['flags'] = 'no_syscall_lock'
iface_config['xdp_api_params'] = xdp_api_params
# Buffer normalization (auto → computed)
_normalize_buffers(config)
+ # Configure VPP main-core and workers 'cpu-cores' settings
+ _configure_vpp_cpu_settings(config)
if removed_ifaces:
config['removed_ifaces'] = removed_ifaces
@@ -507,38 +511,15 @@ def verify(config):
raise ConfigError(f'Interface {iface} does not exist or is not Ethernet!')
# Resource usage checks
- cpu_settings = config['settings'].get('cpu', {})
-
- if not any(key in cpu_settings for key in ('workers', 'corelist_workers')):
- verify_vpp_minimum_cpus()
-
- if 'cpu' in config['settings']:
- # Check whether the workers and corelist-workers are configured properly
- verify_vpp_settings_cpu(cpu_settings)
-
- # Check if there are enough CPU cores to skip according to config
- if 'skip_cores' in cpu_settings:
- skip_cores = int(cpu_settings['skip_cores'])
- verify_vpp_settings_cpu_skip_cores(skip_cores)
-
- # Check if there are enough CPU cores to add workers
- if 'workers' in cpu_settings:
- verify_vpp_settings_cpu_workers(cpu_settings)
-
- if 'main_core' in cpu_settings:
- verify_vpp_cpu_main_core(cpu_settings)
-
- # Check the CPU main core not falling to the corelist-workers
- if 'corelist_workers' in cpu_settings:
- verify_vpp_settings_cpu_corelist_workers(cpu_settings)
-
- workers = _get_workers_count(config['settings'].get('cpu', {}))
+ cpu_cores = int(config['settings']['resource_allocation']['cpu_cores'])
+ verify_vpp_minimum_cpus()
+ verify_vpp_cpu_cores(cpu_cores)
verify_vpp_main_heap_size(config['settings'])
verify_vpp_statseg_size(config['settings'])
# Check buffers
- verify_vpp_buffers(config['settings'], workers)
+ verify_vpp_buffers(config['settings'])
# Check if available memory is enough for current VPP config
verify_vpp_memory(config)
@@ -579,13 +560,13 @@ def verify(config):
if 'num_rx_queues' in iface_config['dpdk_options']:
rx_queues = int(iface_config['dpdk_options']['num_rx_queues'])
verify_vpp_interfaces_dpdk_num_queues(
- qtype='receive', num_queues=rx_queues, workers=workers
+ qtype='receive', num_queues=rx_queues, workers=cpu_cores
)
if 'num_tx_queues' in iface_config['dpdk_options']:
tx_queues = int(iface_config['dpdk_options']['num_tx_queues'])
verify_vpp_interfaces_dpdk_num_queues(
- qtype='transmit', num_queues=tx_queues, workers=workers
+ qtype='transmit', num_queues=tx_queues, workers=cpu_cores
)
# RX-mode verification
@@ -652,7 +633,7 @@ def verify(config):
f'Interface {iface_config["iface_name"]} is an xconnect member and cannot be removed'
)
- verify_routes_count(config['settings'], workers)
+ verify_routes_count(config['settings'])
def generate(config):
diff --git a/src/migration-scripts/vpp/7-to-8 b/src/migration-scripts/vpp/7-to-8
index fa105a6b5..0b2f81b4c 100644
--- a/src/migration-scripts/vpp/7-to-8
+++ b/src/migration-scripts/vpp/7-to-8
@@ -20,6 +20,8 @@
# Drop settings for nat workers (T8254)
#
# Delete 'ipsec' node and all settings and replace it with single 'ipsec-acceleration' flag (T8262)
+#
+# Unify CPU settings into a single 'cpu-cores' node under 'resource-allocation' (T8268)
from vyos.configtree import ConfigTree
@@ -71,6 +73,38 @@ def _migrate_vpp_ipsec(config: ConfigTree) -> None:
config.set(base + ['ipsec-acceleration'])
config.delete(base + ['ipsec'])
+def _migrate_vpp_cpu(config: ConfigTree) -> None:
+ settings_path = ['vpp', 'settings']
+ cpu_path = settings_path + ['cpu']
+
+ if not config.exists(cpu_path):
+ # Nothing to do
+ return
+
+ # get number of configured workers
+ workers = 0
+
+ if config.exists(cpu_path + ['workers']):
+ workers += int(config.return_value(cpu_path + ['workers']))
+ # add main-core to total workers
+ workers += 1
+
+ if config.exists(cpu_path + ['corelist-workers']):
+ def _count_range(item: str) -> int:
+ if '-' in item:
+ start, end = map(int, item.split('-'))
+ return end - start + 1
+ return 1
+
+ tmp = config.return_values(cpu_path + ['corelist-workers'])
+ workers = sum(_count_range(item) for item in tmp) + 1 # + main core
+
+ # set 'resource-allocation cpu-cores'
+ if workers:
+ config.set(settings_path + ['resource-allocation', 'cpu-cores'], value=str(workers))
+
+ config.delete(cpu_path)
+
def migrate(config: ConfigTree) -> None:
if not config.exists(['vpp']):
@@ -81,3 +115,4 @@ def migrate(config: ConfigTree) -> None:
_migrate_vpp_log(config)
_migrate_vpp_nat44(config)
_migrate_vpp_ipsec(config)
+ _migrate_vpp_cpu(config)