diff options
| author | Viacheslav Hletenko <v.gletenko@vyos.io> | 2025-09-10 10:31:19 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-10 10:31:19 +0300 |
| commit | 41eae8e050fc9afeec7c645ee33da8fdb342056c (patch) | |
| tree | 59bd65b2200879bbb2b6efcc67cbb4a8af795a24 /src | |
| parent | 1124d3f9aa0531489bc8f622143afcb6116e8f47 (diff) | |
| parent | b0ae930a9fcb3093d3069bb8296a2f572e6a3d93 (diff) | |
| download | vyos-1x-41eae8e050fc9afeec7c645ee33da8fdb342056c.tar.gz vyos-1x-41eae8e050fc9afeec7c645ee33da8fdb342056c.zip | |
Merge pull request #4690 from natali-rs1985/T7757
T7757: VPP Verify buffers for rx/tx queues
Diffstat (limited to 'src')
| -rwxr-xr-x | src/conf_mode/vpp.py | 58 |
1 files changed, 41 insertions, 17 deletions
diff --git a/src/conf_mode/vpp.py b/src/conf_mode/vpp.py index 9517f85f3..518860605 100755 --- a/src/conf_mode/vpp.py +++ b/src/conf_mode/vpp.py @@ -58,7 +58,9 @@ from vyos.vpp.config_verify import ( verify_vpp_interfaces_dpdk_num_queues, verify_routes_count, verify_vpp_main_heap_size, + verify_vpp_buffers, ) +from vyos.vpp.config_resource_checks import memory from vyos.vpp.config_filter import iface_filter_eth from vyos.vpp.utils import EthtoolGDrvinfo from vyos.vpp.configdb import JSONStorage @@ -147,6 +149,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) + ) + + return len(corelist_workers) + + return int(cpu_settings.get('workers', 0)) + + +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) + config['settings']['buffers']['buffers_per_numa'] = str(buffers) + + def get_config(config=None): # use persistent config to store interfaces data between executions # this is required because some interfaces after they are connected @@ -223,10 +247,12 @@ def get_config(config=None): # dictionary retrieved. default_values = conf.get_config_defaults(**config.kwargs, recursive=True) - # delete 'xdp-options' from defaults if driver is DPDK + # delete driver-incompatible defaults for iface, iface_config in config.get('settings', {}).get('interface', {}).items(): if iface_config.get('driver') == 'dpdk': del default_values['settings']['interface'][iface]['xdp_options'] + elif iface_config.get('driver') == 'xdp': + del default_values['settings']['interface'][iface]['dpdk_options'] config = config_dict_merge(default_values, config) @@ -239,9 +265,10 @@ def get_config(config=None): default_values_effective = conf.get_config_defaults( **effective_config.kwargs, recursive=True ) - config['effective'] = config_dict_merge( - default_values_effective, effective_config - ) + effective_config = config_dict_merge(default_values_effective, effective_config) + # Buffer normalization (auto → computed) + _normalize_buffers(effective_config) + config['effective'] = effective_config if 'settings' in config: if 'interface' in config['settings']: @@ -314,6 +341,9 @@ def get_config(config=None): xdp_api_params['flags'] = 'no_syscall_lock' iface_config['xdp_api_params'] = xdp_api_params + # Buffer normalization (auto → computed) + _normalize_buffers(config) + if removed_ifaces: config['removed_ifaces'] = removed_ifaces config['xconn_members'] = xconn_members @@ -342,15 +372,6 @@ def get_config(config=None): eth_ifaces_persist[iface]['bus_id'] = control_host.get_bus_name(iface) eth_ifaces_persist[iface]['dev_id'] = control_host.get_dev_id(iface) - # Get kernel settings for hugepages - kernel_memory_settings = conf.get_config_dict( - ['system', 'option', 'kernel', 'memory'], - key_mangling=('-', '_'), - get_first_key=True, - no_tag_node_value_mangle=True, - ) - config['kernel_memory_settings'] = kernel_memory_settings - # Return to config dictionary config['persist_config'] = eth_ifaces_persist @@ -379,8 +400,6 @@ def verify(config): raise ConfigError(f'Interface {iface} does not exist or is not Ethernet!') # Resource usage checks - workers = 0 - if 'cpu' in config['settings']: cpu_settings = config['settings']['cpu'] @@ -394,14 +413,16 @@ def verify(config): # Check if there are enough CPU cores to add workers if 'workers' in cpu_settings: - workers = verify_vpp_settings_cpu_workers(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: - workers = verify_vpp_settings_cpu_corelist_workers(cpu_settings) + verify_vpp_settings_cpu_corelist_workers(cpu_settings) + + workers = _get_workers_count(config['settings'].get('cpu', {})) if 'workers' in config['settings']['nat44']: verify_vpp_nat44_workers( @@ -411,6 +432,9 @@ def verify(config): verify_vpp_main_heap_size(config['settings']) verify_vpp_statseg_size(config['settings']) + # Check buffers + verify_vpp_buffers(config['settings'], workers) + # Check if available memory is enough for current VPP config verify_vpp_memory(config) |
