diff options
| author | Viacheslav Hletenko <v.gletenko@vyos.io> | 2026-02-17 16:05:48 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-02-17 16:05:48 +0200 |
| commit | 9785f396ba1e82b6b359e42af7da03828b4ff6ed (patch) | |
| tree | 3ca807b3c1210e871fca08c10f167be751c16e7c /src | |
| parent | 33752c9a41f2e79c1ef3884188968d0f48bc79d8 (diff) | |
| parent | 2414c156cc21bfe51b65f8726f186c55b533bb97 (diff) | |
| download | vyos-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-x | src/conf_mode/vpp.py | 81 | ||||
| -rw-r--r-- | src/migration-scripts/vpp/7-to-8 | 35 |
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) |
