summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkhramshinr <khramshinr@gmail.com>2025-02-26 12:28:28 +0700
committerkhramshinr <khramshinr@gmail.com>2025-02-26 17:41:02 +0700
commit43374315e587306f4e40aefc6747ec9775752435 (patch)
tree6cfb21d7082d3ae643a85ad861d0aa053c1edc00
parenta6047cbf6c507587fdcf78507755823c99030778 (diff)
downloadvyos-1x-43374315e587306f4e40aefc6747ec9775752435.tar.gz
vyos-1x-43374315e587306f4e40aefc6747ec9775752435.zip
T7200: Reduce memory size usage for vpp smoke tests
add more memory validation
-rwxr-xr-xsmoketest/scripts/cli/test_vpp.py29
-rwxr-xr-xsrc/conf_mode/vpp.py43
2 files changed, 59 insertions, 13 deletions
diff --git a/smoketest/scripts/cli/test_vpp.py b/smoketest/scripts/cli/test_vpp.py
index 69f1410ab..9605f010a 100755
--- a/smoketest/scripts/cli/test_vpp.py
+++ b/smoketest/scripts/cli/test_vpp.py
@@ -31,6 +31,7 @@ from vyos.configsession import ConfigSessionError
from vyos.utils.process import process_named_running
from vyos.utils.file import read_file
from vyos.utils.process import rc_cmd
+from vyos.vpp.utils import human_page_memory_to_bytes
sys.path.append(os.getenv('vyos_completion_dir'))
from list_mem_page_size import list_mem_page_size
@@ -1106,24 +1107,46 @@ class TestVPP(VyOSUnitTestSHIM.TestCase):
for config_entry in config_entries:
self.assertIn(config_entry, config)
- def test_13_mem_page_size(self):
+ def test_13_1_buffer_page_size(self):
sizes = ['default', 'default-hugepage'] + list_mem_page_size()
for size in sizes:
+ if human_page_memory_to_bytes(size) >= 1 << 30:
+ continue
self.cli_set(base_path + ['settings', 'buffers', 'page-size', size])
+ self.cli_commit()
+
+ conf = get_vpp_config()
+ self.assertEqual(conf['buffers']['page-size'], size)
+
+ def test_13_2_statseg_page_size(self):
+ sizes = ['default', 'default-hugepage'] + list_mem_page_size()
+ for size in sizes:
+ if human_page_memory_to_bytes(size) >= 1 << 30:
+ continue
self.cli_set(base_path + ['settings', 'statseg', 'page-size', size])
+ self.cli_commit()
+
+ conf = get_vpp_config()
+ self.assertEqual(conf['statseg']['page-size'], size)
+
+ def test_13_3_mem_page_size(self):
+ sizes = ['default', 'default-hugepage'] + list_mem_page_size()
+ for size in sizes:
+ if human_page_memory_to_bytes(size) >= 1 << 30:
+ continue
self.cli_set(
base_path + ['settings', 'memory', 'main-heap-page-size', size]
)
self.cli_commit()
conf = get_vpp_config()
- self.assertEqual(conf['buffers']['page-size'], size)
- self.assertEqual(conf['statseg']['page-size'], size)
self.assertEqual(conf['memory']['main-heap-page-size'], size)
def test_14_mem_default_hugepage(self):
sizes = list_mem_page_size(hugepage_only=True)
for size in sizes:
+ if human_page_memory_to_bytes(size) >= 1 << 30:
+ continue
self.cli_set(
base_path + ['settings', 'memory', 'default-hugepage-size', size]
)
diff --git a/src/conf_mode/vpp.py b/src/conf_mode/vpp.py
index 97e3c0c7d..90a3bb7fb 100755
--- a/src/conf_mode/vpp.py
+++ b/src/conf_mode/vpp.py
@@ -43,6 +43,7 @@ from vyos.vpp.utils import (
EthtoolGDrvinfo,
human_page_memory_to_bytes,
human_memory_to_bytes,
+ bytes_to_human_memory,
)
from vyos.vpp.configdb import JSONStorage
@@ -295,18 +296,22 @@ def verify_memory(settings):
settings.get('memory', {}).get('main_heap_size', '1G')
)
- memory_main_heap_page_size = settings.get('memory', {}).get(
- 'main_heap_page_size', 0
+ if memory_main_heap < 51 << 20:
+ # vpp is aborted when we try to use a smaller heap size
+ raise ConfigError('The main heap size must be greater than or equal to 51M')
+
+ memory_main_heap_page_size = human_page_memory_to_bytes(
+ settings.get('memory', {}).get('main_heap_page_size', 'default')
)
- if memory_main_heap_page_size:
- memory_main_heap_page_size = human_page_memory_to_bytes(
- memory_main_heap_page_size
- )
- memory_required += (memory_main_heap + memory_main_heap_page_size - 1) & ~(
- memory_main_heap_page_size - 1
+
+ if memory_main_heap_page_size > memory_main_heap:
+ raise ConfigError(
+ f'The main heap size must be greater than or equal to page-size({bytes_to_human_memory(memory_main_heap_page_size, "K")})'
)
- else:
- memory_required += memory_main_heap
+
+ memory_required += (memory_main_heap + memory_main_heap_page_size - 1) & ~(
+ memory_main_heap_page_size - 1
+ )
statseg_size = human_memory_to_bytes(settings.get('statseg', {}).get('size', '96M'))
memory_required += statseg_size
@@ -498,6 +503,24 @@ def verify(config):
'The max_map_count must be greater than or equal to (2 * nr_hugepages)'
)
+ if 'statseg' in config['settings']:
+ _size = human_memory_to_bytes(config['settings']['statseg'].get('size', '96M'))
+
+ if 'size' in config['settings']['statseg']:
+ if _size < 1 << 20:
+ raise ConfigError(
+ 'The statseg size must be greater than or equal to 1M'
+ )
+
+ if 'page_size' in config['settings']['statseg']:
+ _page_size = human_page_memory_to_bytes(
+ config['settings']['statseg']['page_size']
+ )
+ if _page_size > _size:
+ raise ConfigError(
+ f'The statseg size must be greater than or equal to page-size({bytes_to_human_memory(_page_size, "K")})'
+ )
+
# Check if deleted interfaces are not xconnect memebrs
for iface_config in config.get('removed_ifaces', []):
if iface_config['iface_name'] in config.get('xconn_members', {}):