Skip to content

Commit

Permalink
hugepage_reset: Test compatible with different NUMA topologies
Browse files Browse the repository at this point in the history
As the test will set 8 hugepages, this works fine
for systems with 2 NUMA nodes, having e.g. 8 nodes
is going to lead the on_numa_node variant to fail
since the binded node doesn't have enough hugepages.

As the cfg already suggests to allocate 1G hugepages
on boot time, let's make user decision how many hugepages
allocate, adding an informative comment in the cfg as well.

Finally, if system hugepage_size is 1GB, allocates at
runtime enough hugepages in all valid nodes.

Signed-off-by: mcasquer <[email protected]>
  • Loading branch information
mcasquer committed Jan 15, 2025
1 parent 561916a commit b1013a9
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 4 deletions.
6 changes: 4 additions & 2 deletions qemu/tests/cfg/hugepage_reset.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
pre_command = 'echo 3 > /proc/sys/vm/drop_caches && echo 1 > /proc/sys/vm/compact_memory'
mem = 4096
origin_nr = 8
# Please set hugepage in kernel command line before this test:
# default_hugepagesz=1G hugepagesz=1G hugepages=8
# Please allocate enough hugepages at boot time for this test.
# IMPORTANT! Keep in mind the system memory and the number of NUMA nodes
# to decide how many hugepages are needed to be allocated.
# Example: default_hugepagesz=1G hugepagesz=1G hugepages=24
expected_hugepage_size = 1048576
Windows:
x86_64:
Expand Down
22 changes: 20 additions & 2 deletions qemu/tests/hugepage_reset.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,24 @@ def run(test, params, env):
:param env: Dictionary with the test environment.
"""

def allocate_largepages_per_node():
"""
The functions is inteded to set 1G hugepages per NUMA
node when the system has four or more of these nodes.
For this function to work the hugepage size should be 1G.
This way a QEMU failure could be avoided if it's unable
to allocate memory.
"""
node_list = host_numa_node.online_nodes_withcpumem
if len(node_list) >= 4:
for node in node_list:
node_mem_free = int(
host_numa_node.read_from_node_meminfo(node, "MemFree")
)
mem_kb = mem * 1024
if node_mem_free > mem_kb:
hp_config.set_node_num_huge_pages(4, node, "1048576")

def set_hugepage():
"""Set nr_hugepages"""
try:
Expand Down Expand Up @@ -107,9 +125,9 @@ def heavyload_install():
"No node on your host has sufficient free memory for " "this test."
)
hp_config = test_setup.HugePageConfig(params)
if params.get("on_numa_node"):
allocate_largepages_per_node()
hp_config.target_hugepages = origin_nr
test.log.info("Setup hugepage number to %s", origin_nr)
hp_config.setup()
hugepage_size = utils_memory.get_huge_page_size()
params["hugepage_path"] = hp_config.hugepage_path
params["start_vm"] = "yes"
Expand Down

0 comments on commit b1013a9

Please sign in to comment.