[LTP] [PATCH] numa: Add new regression test for MPOL_PREFERRED poliy
Li Wang
liwang@redhat.com
Wed Aug 16 11:12:57 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>
---
testcases/kernel/numa/README | 3 +++
testcases/kernel/numa/numa01.sh | 39 +++++++++++++++++++++++++++++++++++-
testcases/kernel/numa/support_numa.c | 17 ++++++++++++++++
3 files changed, 58 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..59879f4 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
@@ -82,6 +83,7 @@ wait_for_support_numa()
setup()
{
export MB=$((1024*1024))
+ export GB=$((1024*1024*1024))
export PAGE_SIZE=$(getconf PAGE_SIZE)
export HPAGE_SIZE=$(awk '/Hugepagesize:/ {print $2}' /proc/meminfo)
@@ -458,4 +460,39 @@ test11()
tst_res TPASS "NUMA local node hugepage memory allocated"
}
+# Verification of THP memory allocated on preferred node
+test12()
+{
+ Mem_curr=0
+
+ 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_1GB_THP &
+ pid=$!
+
+ wait_for_support_numa $pid
+
+ Mem_curr=$(echo "$(extract_numastat_p $pid $Preferred_node) * $MB" |bc)
+ if [ $(echo "$Mem_curr < $GB" |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..37790e7 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_1GB_THP\" then allocate 1GB 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,22 @@ int main(int argc, char *argv[])
munmap(buf, sb.st_size);
close(fd);
remove(TEST_SFILE);
+ } else if (!strcmp(argv[1], "alloc_1GB_THP")) {
+ size_t size = 1024 * MB;
+
+ 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