summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorNataliia Solomko <natalirs1985@gmail.com>2025-09-01 14:08:21 +0300
committerNataliia Solomko <natalirs1985@gmail.com>2025-09-05 10:57:51 +0300
commit5c6e25f50ddac493ab6c61726fb4a1f96b9bf55c (patch)
treec5d03433c6a7347b5ae8443110e091e4f4f7c7c7 /python
parent133cb0c65d5aa2ca5a96feba6ab7adc3a8f1de58 (diff)
downloadvyos-1x-5c6e25f50ddac493ab6c61726fb4a1f96b9bf55c.tar.gz
vyos-1x-5c6e25f50ddac493ab6c61726fb4a1f96b9bf55c.zip
T7757: VPP Verify buffers for rx/tx queues
Diffstat (limited to 'python')
-rw-r--r--python/vyos/vpp/config_resource_checks/memory.py34
-rw-r--r--python/vyos/vpp/config_verify.py12
2 files changed, 46 insertions, 0 deletions
diff --git a/python/vyos/vpp/config_resource_checks/memory.py b/python/vyos/vpp/config_resource_checks/memory.py
index 9391e21e1..8b201ef87 100644
--- a/python/vyos/vpp/config_resource_checks/memory.py
+++ b/python/vyos/vpp/config_resource_checks/memory.py
@@ -28,6 +28,10 @@ from vyos.vpp.utils import (
from vyos.vpp.config_resource_checks.resource_defaults import default_resource_map
+# VPP buffers default per NUMA node
+MIN_BUFFERS = 16_384
+
+
def classify_page_size(page_size_bytes: int) -> str:
"""
Returns one of: '4K', '2M', '1G' based on page size.
@@ -187,3 +191,33 @@ def total_memory_required(settings: dict) -> dict:
memory[classify_page_size(page_size)] += memory_size
return memory
+
+
+def buffers_required(settings: dict, workers) -> int:
+ """
+ Calculate total VPP buffer requirements based on interface settings and workers.
+ """
+ buffers_total = 0
+ for ifname, iface_config in settings.get('interface', {}).items():
+ if iface_config.get('driver') == 'xdp':
+ continue
+ dpdk_options = iface_config.get('dpdk_options', {})
+ rx_queues = int(dpdk_options.get('num_rx_queues', 1))
+ rx_desc = int(dpdk_options.get('num_rx_desc'))
+ tx_queues = int(dpdk_options.get('num_tx_queues', workers + 1))
+ tx_desc = int(dpdk_options.get('num_tx_desc'))
+
+ # buffers for RX/TX queues for interface
+ buffers_total += rx_queues * rx_desc + tx_queues * tx_desc
+
+ # per-thread buffer caches (approx. 256 buffers per worker)
+ buffers_total += workers * 256
+
+ # Safety margin for buffer calculations:
+ # traffic bursts, alignment/metadata overhead etc.
+ # The factor 2.5 is derived from VPP’s own calculations:
+ # https://github.com/FDio/vpp/blob/stable/2506/extras/vpp_config/vpplib/AutoConfig.py#L609
+ buffers_total = int(buffers_total * 2.5)
+
+ # Enforce minimum required by VPP (16K buffers)
+ return max(buffers_total, MIN_BUFFERS)
diff --git a/python/vyos/vpp/config_verify.py b/python/vyos/vpp/config_verify.py
index cf0b923bb..78c5d420b 100644
--- a/python/vyos/vpp/config_verify.py
+++ b/python/vyos/vpp/config_verify.py
@@ -442,3 +442,15 @@ def verify_routes_count(settings: dict, workers: int):
'Extensive use of features like ACLs, NAT and others may reduce the numbers above. '
'Please read the documentation for details: https://docs.vyos.io/'
)
+
+
+def verify_vpp_buffers(settings: dict, workers: int):
+ buffers_configured = int(settings['buffers']['buffers_per_numa'])
+
+ buffers_required = mem_checks.buffers_required(settings, workers)
+
+ if buffers_required > buffers_configured:
+ raise ConfigError(
+ 'Not enough buffers to initialize RX/TX queues for interfaces. '
+ f'Set "vpp settings buffers buffers-per-numa" to {buffers_required} or higher'
+ )