summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/completion/list_mem_page_size.py69
-rwxr-xr-xsrc/conf_mode/vpp.py47
2 files changed, 100 insertions, 16 deletions
diff --git a/src/completion/list_mem_page_size.py b/src/completion/list_mem_page_size.py
new file mode 100644
index 000000000..1ed81a15f
--- /dev/null
+++ b/src/completion/list_mem_page_size.py
@@ -0,0 +1,69 @@
+#!/usr/bin/env python3
+#
+# Copyright (C) 2025 VyOS Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see <http://www.gnu.org/licenses/>.
+import argparse
+from vyos.vpp.utils import (
+ get_hugepage_sizes,
+ get_default_hugepage_size,
+ get_default_page_size,
+ bytes_to_human_memory,
+)
+
+
+def get_default_page_sizes() -> list[int]:
+ """
+ Retrieve the system's default page sizes, including huge pages.
+ :return: A list of page sizes in bytes.
+ """
+ page_sizes = []
+ # default system page size
+ page_size = get_default_page_size()
+ if page_size:
+ page_sizes.append(page_size)
+
+ # default huge page size
+ page_size = get_default_hugepage_size()
+ if page_size:
+ page_sizes.append(page_size)
+
+ return page_sizes
+
+
+def list_mem_page_size(hugepage_only=None) -> list[str]:
+ result = []
+ page_sizes = get_hugepage_sizes()
+
+ if not hugepage_only:
+ page_sizes += get_default_page_sizes()
+
+ page_sizes = set(page_sizes)
+ for unit in ['K', 'M', 'G']:
+ for size in page_sizes:
+ if val := bytes_to_human_memory(size, unit):
+ result.append(val)
+
+ return result
+
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ '--hugepage_only', type=str, help='List only available hugepage sizes.'
+ )
+ args = parser.parse_args()
+
+ result = list_mem_page_size(args.hugepage_only)
+ print(' '.join(result))
diff --git a/src/conf_mode/vpp.py b/src/conf_mode/vpp.py
index ec6873e0d..aea0c1754 100755
--- a/src/conf_mode/vpp.py
+++ b/src/conf_mode/vpp.py
@@ -39,7 +39,11 @@ from vyos.vpp import control_host
from vyos.vpp.config_deps import deps_xconnect_dict
from vyos.vpp.config_verify import verify_dev_driver
from vyos.vpp.config_filter import iface_filter_eth
-from vyos.vpp.utils import EthtoolGDrvinfo
+from vyos.vpp.utils import (
+ EthtoolGDrvinfo,
+ human_page_memory_to_bytes,
+ human_memory_to_bytes,
+)
from vyos.vpp.configdb import JSONStorage
airbag.enable()
@@ -252,18 +256,6 @@ def get_config(config=None):
return config
-def convert_to_int(val):
- rates = {
- 'K': 1024,
- 'M': 1024**2,
- 'G': 1024**3,
- }
- try:
- return int(val)
- except ValueError:
- return int(val[:-1]) * rates[val[-1]]
-
-
def verify_memory(settings):
memory_available: int = virtual_memory().available
cpus: int = get_core_count()
@@ -283,12 +275,24 @@ def verify_memory(settings):
)
memory_required += netlink_buffer_size
- memory_main_heap = convert_to_int(
+ memory_main_heap = human_memory_to_bytes(
settings.get('memory', {}).get('main_heap_size', '1G')
)
- memory_required += memory_main_heap
- statseg_size = convert_to_int(settings.get('statseg', {}).get('size', '96M'))
+ memory_main_heap_page_size = settings.get('memory', {}).get(
+ 'main_heap_page_size', 0
+ )
+ 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
+ )
+ else:
+ memory_required += memory_main_heap
+
+ statseg_size = human_memory_to_bytes(settings.get('statseg', {}).get('size', '96M'))
memory_required += statseg_size
if memory_available < memory_required:
@@ -452,6 +456,17 @@ def verify(config):
raise ConfigError('"cpu corelist-workers" is not correct')
verify_memory(config['settings'])
+ if 'host_resources' in config['settings']:
+ if (
+ 'nr_hugepages' in config['settings']['host_resources']
+ and 'max_map_count' in config['settings']['host_resources']
+ ):
+ if int(config['settings']['host_resources']['max_map_count']) < 2 * int(
+ config['settings']['host_resources']['nr_hugepages']
+ ):
+ raise ConfigError(
+ 'The max_map_count must be greater than or equal to (2 * nr_hugepages)'
+ )
# Check if deleted interfaces are not xconnect memebrs
for iface_config in config.get('removed_ifaces', []):