[Devel] [PATCH vz10 v3 2/2 comments] selftests: cgroup: add documentation comments to numa migration tests
Konstantin Khorenko
khorenko at virtuozzo.com
Thu Dec 4 00:31:59 MSK 2025
i also suggest to add more comments describing the tests so anyone who opens the
file could understand what does it do on a highlevel.
Something like this, but please, check the descriptions fo validness, they are
generated.
Add file-level header comment describing the test suite and listing all
test variants. Add individual comments before each test variant explaining
what type of memory migration it tests.
https://virtuozzo.atlassian.net/browse/VSTOR-114785
Signed-off-by: Konstantin Khorenko <khorenko at virtuozzo.com>
---
.../selftests/cgroup/test_numa_migrate.c | 76 +++++++++++++++++++
1 file changed, 76 insertions(+)
diff --git a/tools/testing/selftests/cgroup/test_numa_migrate.c b/tools/testing/selftests/cgroup/test_numa_migrate.c
index 8f5e9e62ddc41..daa1a88849835 100644
--- a/tools/testing/selftests/cgroup/test_numa_migrate.c
+++ b/tools/testing/selftests/cgroup/test_numa_migrate.c
@@ -3,6 +3,32 @@
* Copyright (C) 2025 Virtuozzo International GmbH. All rights reserved.
*/
+/*
+ * NUMA migration of lruvecs test suite
+ *
+ * This test suite verifies the capability of migrating contents of process'
+ * lruvecs from one NUMA node to one or multiple destination nodes using
+ * memory.numa_migrate cgroup v2 interface.
+ *
+ * Test variants:
+ * - disk_file: Migrates active file pages from a regular disk file
+ * - anon: Migrates active anonymous pages
+ * - anon_thp: Migrates anonymous transparent huge pages (THP)
+ * - tmpfs_file: Migrates shared memory (tmpfs) file pages
+ * - tmpfs_thp: Migrates shared memory (tmpfs) transparent huge pages
+ * - inactive_anon: Migrates inactive anonymous pages (expected to fail)
+ * - inactive_disk_file: Migrates inactive file pages (expected to fail)
+ *
+ * Each test creates a memory mapping, populates it with pages on the source
+ * NUMA node, triggers migration via memory.numa_migrate, and verifies that
+ * pages are correctly distributed across destination nodes. Data integrity
+ * is verified using CRC32 checksums during random read/write operations.
+ *
+ * The inactive list tests set memory.max to 50% of the test file size to
+ * force pages into inactive lists. These tests are marked as expected to
+ * fail due to known issues with inactive page migration.
+ */
+
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
@@ -257,6 +283,11 @@ FIXTURE_VARIANT(numa_migrate) {
bool with_mem_limit;
};
+/* Test migration of active file pages from a regular disk file.
+ * Creates a temporary file, maps it with MAP_SHARED, populates it with pages
+ * on the source NUMA node, then triggers migration and verifies that pages
+ * are distributed across destination nodes.
+ */
FIXTURE_VARIANT_ADD(numa_migrate, disk_file) {
.mem_type = MEMORY_TYPE_ACTIVE_FILE,
.verify = verify_active,
@@ -266,6 +297,11 @@ FIXTURE_VARIANT_ADD(numa_migrate, disk_file) {
.with_mem_limit = false,
};
+/* Test migration of active anonymous pages.
+ * Creates an anonymous mapping with MAP_PRIVATE | MAP_ANONYMOUS, populates
+ * it with pages on the source NUMA node, then triggers migration and verifies
+ * that pages are distributed across destination nodes.
+ */
FIXTURE_VARIANT_ADD(numa_migrate, anon) {
.mem_type = MEMORY_TYPE_ACTIVE_ANON,
.verify = verify_active,
@@ -275,6 +311,12 @@ FIXTURE_VARIANT_ADD(numa_migrate, anon) {
.with_mem_limit = false,
};
+/* Test migration of anonymous transparent huge pages (THP).
+ * Creates an anonymous mapping with MAP_PRIVATE | MAP_ANONYMOUS, uses
+ * MADV_HUGEPAGE to enable THP, populates it with huge pages on the source
+ * NUMA node, then triggers migration and verifies that huge pages are
+ * distributed across destination nodes.
+ */
FIXTURE_VARIANT_ADD(numa_migrate, anon_thp) {
.mem_type = MEMORY_TYPE_ANON_THP,
.verify = verify_active,
@@ -284,6 +326,11 @@ FIXTURE_VARIANT_ADD(numa_migrate, anon_thp) {
.with_mem_limit = false,
};
+/* Test migration of shared memory (tmpfs) file pages.
+ * Creates a memfd file (tmpfs), maps it with MAP_SHARED, populates it with
+ * pages on the source NUMA node, then triggers migration and verifies that
+ * pages are distributed across destination nodes.
+ */
FIXTURE_VARIANT_ADD(numa_migrate, tmpfs_file) {
.mem_type = MEMORY_TYPE_TMPFS_FILE,
.verify = verify_active,
@@ -293,6 +340,12 @@ FIXTURE_VARIANT_ADD(numa_migrate, tmpfs_file) {
.with_mem_limit = false,
};
+/* Test migration of shared memory (tmpfs) transparent huge pages (THP).
+ * Creates a memfd file (tmpfs), maps it with MAP_SHARED, uses MADV_HUGEPAGE
+ * to enable THP, populates it with huge pages on the source NUMA node, then
+ * triggers migration and verifies that huge pages are distributed across
+ * destination nodes.
+ */
FIXTURE_VARIANT_ADD(numa_migrate, tmpfs_thp) {
.mem_type = MEMORY_TYPE_TMPFS_FILE_THP,
.verify = verify_active,
@@ -302,6 +355,13 @@ FIXTURE_VARIANT_ADD(numa_migrate, tmpfs_thp) {
.with_mem_limit = false,
};
+/* Test migration of inactive anonymous pages.
+ * Creates an anonymous mapping, sets memory.max to 50% of file_size to force
+ * pages into inactive lists, populates it with pages on the source NUMA node,
+ * then triggers migration and verifies that inactive pages are distributed
+ * across destination nodes. This test is marked as expected to fail due to
+ * a known issue with inactive anon page migration.
+ */
FIXTURE_VARIANT_ADD(numa_migrate, inactive_anon) {
.mem_type = MEMORY_TYPE_INACTIVE_ANON,
.verify = verify_inactive,
@@ -311,6 +371,14 @@ FIXTURE_VARIANT_ADD(numa_migrate, inactive_anon) {
.with_mem_limit = true,
};
+/* Test migration of inactive file pages from a regular disk file.
+ * Creates a temporary file, sets memory.max to 50% of file_size to force
+ * pages into inactive lists, maps it with MAP_SHARED, populates it with
+ * pages on the source NUMA node, then triggers migration and verifies that
+ * inactive pages are distributed across destination nodes. This test is
+ * marked as expected to fail due to a known issue with inactive file page
+ * migration.
+ */
FIXTURE_VARIANT_ADD(numa_migrate, inactive_disk_file) {
.mem_type = MEMORY_TYPE_INACTIVE_FILE,
.verify = verify_inactive,
@@ -504,6 +572,14 @@ static int touch_pages(const char *cgroup, void *arg)
return EXIT_SUCCESS;
}
+/* Main test function that verifies NUMA migration of lruvecs.
+ * Spawns a child process that creates a memory mapping and populates it with
+ * pages on the source NUMA node. The child process continuously performs
+ * random reads and writes while calculating CRC32 checksums to verify data
+ * integrity. After allowing pages to stabilize, triggers migration via
+ * memory.numa_migrate and verifies that pages are correctly distributed
+ * across destination NUMA nodes according to the test variant.
+ */
TEST_F(numa_migrate, migrate)
{
int child_pid;
--
2.43.0
More information about the Devel
mailing list