[LTP] [PATCH v2] numa: Add new regression test for MPOL_PREFERRED poliy
Li Wang
liwang@redhat.com
Wed Aug 23 08:47:42 CEST 2017
Kernel bug description:
Allocating memory on node1 with MPOL_PREFERRED policy doesn't work
with THP enabled, it always fallbacks to local node (ex. node0).
This impacts workload performance for multi node systems.
It has been fixed by:
commit 0867a57c (mm, thp: respect MPOL_PREFERRED policy with non-local node)
Test on kernel without this patch:
12 TFAIL: NUMA memory allocated in node1 is less than expected
Test on kernel with this fix:
12 TPASS: NUMA preferred node policy verified with THP enabled
Signed-off-by: Li Wang <liwang@redhat.com>
---
Notes:
v1 --> v2
* add transparent_hugepage/enabled check
* shrink the test memory from 1GB to 2HPAGE size
testcases/kernel/numa/README | 3 +++
testcases/kernel/numa/numa01.sh | 43 +++++++++++++++++++++++++++++++++++-
testcases/kernel/numa/support_numa.c | 19 ++++++++++++++++
3 files changed, 64 insertions(+), 1 deletion(-)
diff --git a/testcases/kernel/numa/README b/testcases/kernel/numa/README
index a5c3f1b..846d36d 100644
--- a/testcases/kernel/numa/README
+++ b/testcases/kernel/numa/README
@@ -57,6 +57,9 @@ Verifieds the NUMA migratepages policy.
TestCase11:
Verifies the hugepage memory allocated from the node we specify.
+TestCase12:
+Verifies the preferred node policy with THP memory allocating from the node we specify.
+
Pre-requisites
====================================================================================================================
* libnuma should be installed on the NUMA machine before executing theses testcases
diff --git a/testcases/kernel/numa/numa01.sh b/testcases/kernel/numa/numa01.sh
index b831ada..fd3b4be 100755
--- a/testcases/kernel/numa/numa01.sh
+++ b/testcases/kernel/numa/numa01.sh
@@ -32,10 +32,11 @@
# Test #9: Verifies numa_node_size api #
# Test #10:Verifies Migratepages #
# Test #11:Verifies hugepage alloacted on specified node #
+# Test #12:Verifies THP memory allocated on preferred node #
# #
##############################################################################
-TST_CNT=11
+TST_CNT=12
TST_SETUP=setup
TST_TESTFUNC=test
TST_NEEDS_TMPDIR=1
@@ -458,4 +459,44 @@ test11()
tst_res TPASS "NUMA local node hugepage memory allocated"
}
+# Verification of THP memory allocated on preferred node
+test12()
+{
+ Mem_curr=0
+
+ if ! grep -q '\[always\]' /sys/kernel/mm/transparent_hugepage/enabled; then
+ tst_res TCONF "THP is not supported/enabled"
+ return
+ fi
+
+ COUNTER=1
+ for node in $nodes_list; do
+
+ if [ $COUNTER -eq $total_nodes ]; then #wrap up for last node
+ Preferred_node=$(echo $nodes_list | cut -d ' ' -f 1)
+ else
+ # always next node is preferred node
+ Preferred_node=$(echo $nodes_list | cut -d ' ' -f $((COUNTER+1)))
+ fi
+
+ numactl --cpunodebind=$node --preferred=$Preferred_node support_numa alloc_2HPSZ_THP &
+ pid=$!
+
+ wait_for_support_numa $pid
+
+ Mem_curr=$(echo "$(extract_numastat_p $pid $Preferred_node) * 1024" |bc)
+ if [ $(echo "$Mem_curr < $HPAGE_SIZE * 2" |bc ) -eq 1 ]; then
+ tst_res TFAIL \
+ "NUMA memory allocated in node$Preferred_node is less than expected"
+ kill -CONT $pid >/dev/null 2>&1
+ return
+ fi
+
+ COUNTER=$((COUNTER+1))
+ kill -CONT $pid >/dev/null 2>&1
+ done
+
+ tst_res TPASS "NUMA preferred node policy verified with THP enabled"
+}
+
tst_run
diff --git a/testcases/kernel/numa/support_numa.c b/testcases/kernel/numa/support_numa.c
index 4904cc5..4e8be4c 100644
--- a/testcases/kernel/numa/support_numa.c
+++ b/testcases/kernel/numa/support_numa.c
@@ -53,6 +53,7 @@ static void help(void)
printf("Input: Describe input arguments to this program\n");
printf(" argv[1] == \"alloc_1MB\" then allocate 1MB of memory\n");
printf(" argv[1] == \"alloc_1MB_shared\" then allocate 1MB of share memory\n");
+ printf(" argv[1] == \"alloc_2HPSZ_THP\" then allocate 2HUGE PAGE SIZE of THP memory\n");
printf(" argv[1] == \"alloc_1huge_page\" then allocate 1HUGE PAGE SIZE of memory\n");
printf(" argv[1] == \"pause\" then pause the program to catch sigint\n");
printf("Exit: On failure - Exits with non-zero value\n");
@@ -138,6 +139,24 @@ int main(int argc, char *argv[])
munmap(buf, sb.st_size);
close(fd);
remove(TEST_SFILE);
+ } else if (!strcmp(argv[1], "alloc_2HPSZ_THP")) {
+ ssize_t size = 2 * read_hugepagesize();
+ if (size == 0)
+ exit(1);
+
+ buf = mmap(NULL, size, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS,
+ -1, 0);
+ if (buf == MAP_FAILED) {
+ perror("mmap failed");
+ exit(1);
+ }
+
+ memset(buf, 'a', size);
+
+ raise(SIGSTOP);
+
+ munmap(buf, size);
} else if (!strcmp(argv[1], "alloc_1huge_page")) {
hpsz = read_hugepagesize();
if (hpsz == 0)
--
2.9.3
More information about the ltp
mailing list