Huge Zero Page feature has been added in kernel-3.17, so I draft these testcase to cover it in LTP.
hzp01.sh: Checking if the HZP feature works well. hzp02.sh: Checking if the HZP feature peformed well. hzp03.sh: Do Huge Zero Page stress test. Reference: https://lwn.net/Articles/525301/ Signed-off-by: Li Wang <liw...@redhat.com> --- runtest/mm | 4 ++ testcases/kernel/mem/thp/Makefile | 3 +- testcases/kernel/mem/thp/hzp/Makefile | 20 ++++++ testcases/kernel/mem/thp/hzp/hzp01.sh | 108 ++++++++++++++++++++++++++++++++ testcases/kernel/mem/thp/hzp/hzp02.sh | 93 +++++++++++++++++++++++++++ testcases/kernel/mem/thp/hzp/hzp03.sh | 54 ++++++++++++++++ testcases/kernel/mem/thp/hzp/hzp_lib.sh | 76 ++++++++++++++++++++++ testcases/kernel/mem/thp/hzp/memcmp01.c | 47 ++++++++++++++ testcases/kernel/mem/thp/hzp/memcmp02.c | 62 ++++++++++++++++++ 9 files changed, 466 insertions(+), 1 deletion(-) create mode 100644 testcases/kernel/mem/thp/hzp/Makefile create mode 100755 testcases/kernel/mem/thp/hzp/hzp01.sh create mode 100755 testcases/kernel/mem/thp/hzp/hzp02.sh create mode 100755 testcases/kernel/mem/thp/hzp/hzp03.sh create mode 100755 testcases/kernel/mem/thp/hzp/hzp_lib.sh create mode 100644 testcases/kernel/mem/thp/hzp/memcmp01.c create mode 100644 testcases/kernel/mem/thp/hzp/memcmp02.c diff --git a/runtest/mm b/runtest/mm index 031d766..f1eea2b 100644 --- a/runtest/mm +++ b/runtest/mm @@ -91,6 +91,10 @@ thp05_1 thp05 thp05_2 thp05 -n 10 -N 20 thp05_3 thp05 -n 1 -N 300 +hzp01 hzp01.sh +hzp02 hzp02.sh +hzp03 hzp03.sh + vma01 vma01 vma02 vma02 vma03 vma03 diff --git a/testcases/kernel/mem/thp/Makefile b/testcases/kernel/mem/thp/Makefile index 867dcf0..28757e0 100644 --- a/testcases/kernel/mem/thp/Makefile +++ b/testcases/kernel/mem/thp/Makefile @@ -21,4 +21,5 @@ top_srcdir ?= ../../../.. include $(top_srcdir)/include/mk/testcases.mk include $(top_srcdir)/testcases/kernel/mem/include/libmem.mk -include $(top_srcdir)/include/mk/generic_leaf_target.mk +include $(top_srcdir)/include/mk/generic_trunk_target.mk +SUBDIRS := hzp diff --git a/testcases/kernel/mem/thp/hzp/Makefile b/testcases/kernel/mem/thp/hzp/Makefile new file mode 100644 index 0000000..c91ad17 --- /dev/null +++ b/testcases/kernel/mem/thp/hzp/Makefile @@ -0,0 +1,20 @@ +# Copyright (c) 2015 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +top_srcdir ?= ../../../../.. +include $(top_srcdir)/include/mk/testcases.mk +include $(top_srcdir)/include/mk/generic_leaf_target.mk +INSTALL_TARGETS := *.sh diff --git a/testcases/kernel/mem/thp/hzp/hzp01.sh b/testcases/kernel/mem/thp/hzp/hzp01.sh new file mode 100755 index 0000000..887e99e --- /dev/null +++ b/testcases/kernel/mem/thp/hzp/hzp01.sh @@ -0,0 +1,108 @@ +#!/bin/bash +# #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# # Copyright (C) 2015 Linux Test Project. +# # +# # Licensed under the GNU GPLv2 or later. +# # This program is free software; you can redistribute it and/or modify +# # it under the terms of the GNU General Public License as published by +# # the Free Software Foundation; either version 2 of the License, or +# # (at your option) any later version. +# # +# # This program 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 General Public License for more details. +# # +# # You should have received a copy of the GNU General Public License +# # along with this program; if not, write to the Free Software +# # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# # +# #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# # Description: +# # +# # This THP case measure the RSS size of test process memcmp01 on a system with +# # Huge Zero Page on/off. The size of rss_off is absolutely larger than 100*rss_on, +# # eg. x86_64, the rss_on is about 400K, the rss_off is about 200M. +# # +# # Author: Li Wang <liw...@redhat.com> +# #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +export TCID="hzp01" +export TST_TOTAL=5 + +. test.sh +. hzp_lib.sh + +rss_off=-1 +rss_on=-1 + +hzp_off_test() +{ + # Testing with use_zero_page disable + hzp_off + + # Running the process in background + $TPATH/memcmp01 & >/dev/null + if [ $? -ne 0 ]; then + tst_brkm TBROK "failed to run the process in background." + fi + + sleep 2 + # Check the RSS size of test_memcmp01 + local pid=`pidof "$TPATH/memcmp01"` + rss_off=`pmap -x $pid | grep total | awk '{print $4}'` + tst_resm TINFO "rss_off= $rss_off K" + + # Kill the test process + kill $pid >/dev/null + if [ $? -ne 0 ]; then + tst_brkm TBROK "failed to kill the process." + fi +} + +hzp_on_test() +{ + # Testing with use_zero_page enable + hzp_on + + # Running the process in background + $TPATH/memcmp01 & >/dev/null + if [ $? -ne 0 ]; then + tst_brkm TBROK "failed to run the process in background." + fi + + sleep 2 + # Check the RSS size of test_memcmp01 + local pid=`pidof "$TPATH/memcmp01"` + rss_on=`pmap -x $pid | grep total | awk '{print $4}'` + tst_resm TINFO "rss_on= $rss_on K" + + kill $pid >/dev/null + if [ $? -ne 0 ]; then + tst_brkm TBROK "failed to kill the process." + fi +} + +rss_cmp() +{ + hzp_off_test + hzp_on_test + + # eg. rss_on is about 400k, rss_off is about 200M (arch: x86_64), + # so the size of rss_off should be absolutely lager than 100*rss_on + test_success=`echo "$rss_off > 100*$rss_on" |bc` + if [ $test_success -eq 1 ]; then + tst_resm TPASS "Huge Zero Page works well." + else + tst_resm TFAIL "Huge Zero Page works bad." + fi +} + +#--------Test Start---------- +hzp_setup + +rss_cmp + +hzp_cleanup + +tst_exit diff --git a/testcases/kernel/mem/thp/hzp/hzp02.sh b/testcases/kernel/mem/thp/hzp/hzp02.sh new file mode 100755 index 0000000..e0f8adb --- /dev/null +++ b/testcases/kernel/mem/thp/hzp/hzp02.sh @@ -0,0 +1,93 @@ +#!/bin/bash +# #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# # Copyright (C) 2015 Linux Test Project. +# # +# # Licensed under the GNU GPLv2 or later. +# # This program is free software; you can redistribute it and/or modify +# # it under the terms of the GNU General Public License as published by +# # the Free Software Foundation; either version 2 of the License, or +# # (at your option) any later version. +# # +# # This program 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 General Public License for more details. +# # +# # You should have received a copy of the GNU General Public License +# # along with this program; if not, write to the Free Software +# # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# # +# #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# # Description: +# # +# # This case measure the time consumption of test program memcmp02 on +# # a system with Huge Zero Page on/off, then judge if the HZP performance +# # well or not from the results comparison. +# # +# # Author: Li Wang <liw...@redhat.com> +# #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +export TCID="hzp02" +export TST_TOTAL=5 + +. test.sh +. hzp_lib.sh + +time_elapsed_off=-1 +time_elapsed_on=-1 + +mem_total=`grep MemTotal: /proc/meminfo |awk '{print $2}'` +mem_free=`grep MemFree: /proc/meminfo |awk '{print $2}'` + +tst_resm TINFO "mem_total= $mem_total kB, mem_free= $mem_free kB." + +# Configure Memory testing size +if [ $mem_total -gt 16777216 ]; then + MEM=10 + NUM=8 +elif [ $mem_total -gt 8388608 ]; then + MEM=$(( $mem_free / 1024 / 1000 )) + NUM=$(( $MEM - 6 )) +elif [ $mem_total -gt 2097152 ]; then + MEM=2 + NUM=2 +else + tst_brkm TCONF "Sorry, the system RAM is too low to test." +fi + +test_begin() +{ + # Testing with use_zero_page disable + hzp_off + (time -p taskset -c 0 $TPATH/memcmp02 $MEM) 2> memcmp_off.log + time_elapse_off=`grep real memcmp_off.log|awk '{print $2}'` + tst_resm TINFO "time_elapse_off= $time_elapse_off" + + # Testing with use_zero_page enable + hzp_on + (time -p taskset -c 0 $TPATH/memcmp02 $MEM) 2> memcmp_on.log + time_elapse_on=`grep real memcmp_on.log|awk '{print $2}'` + tst_resm TINFO "time_elapse_on= $time_elapse_on" +} + +test_result() +{ + # Compare the time cosumption with HZP on/off + test_success=`echo "$time_elapse_off > $NUM*$time_elapse_on" |bc` + if [ $test_success -eq 1 ]; then + tst_resm TPASS "Huge Zero Page performed well." + else + tst_resm TFAIL "Huge Zero Page performed bad." + fi +} + +#--------Test Start---------- +hzp_setup + +test_begin + +test_result + +hzp_cleanup + +tst_exit diff --git a/testcases/kernel/mem/thp/hzp/hzp03.sh b/testcases/kernel/mem/thp/hzp/hzp03.sh new file mode 100755 index 0000000..1f58d53 --- /dev/null +++ b/testcases/kernel/mem/thp/hzp/hzp03.sh @@ -0,0 +1,54 @@ +#!/bin/bash +# #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# # Copyright (C) 2015 Linux Test Project. +# # +# # Licensed under the GNU GPLv2 or later. +# # This program is free software; you can redistribute it and/or modify +# # it under the terms of the GNU General Public License as published by +# # the Free Software Foundation; either version 2 of the License, or +# # (at your option) any later version. +# # +# # This program 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 General Public License for more details. +# # +# # You should have received a copy of the GNU General Public License +# # along with this program; if not, write to the Free Software +# # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# # +# # Author: Li Wang <liw...@redhat.com> +# #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +export TCID="hzp03" +export TST_TOTAL=1 + +. test.sh +. hzp_lib.sh + +MAX_LOOP=2000 +RC=0 + +hzp_stress_test() +{ + for ((i = 0; i < $MAX_LOOP; i++)) + { + hzp_on || RC=$? + hzp_off || RC=$? + } + + if [ $RC -eq 0 ]; then + tst_resm TPASS "finished running the stress test." + else + tst_resm TFAIL "please check log message." + fi +} + +#--------Test Start---------- +hzp_setup + +hzp_stress_test + +hzp_cleanup + +tst_exit diff --git a/testcases/kernel/mem/thp/hzp/hzp_lib.sh b/testcases/kernel/mem/thp/hzp/hzp_lib.sh new file mode 100755 index 0000000..99f417e --- /dev/null +++ b/testcases/kernel/mem/thp/hzp/hzp_lib.sh @@ -0,0 +1,76 @@ +#!/bin/bash +# #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# # Copyright (C) 2015 Linux Test Project. +# # +# # Licensed under the GNU GPLv2 or later. +# # This program is free software; you can redistribute it and/or modify +# # it under the terms of the GNU General Public License as published by +# # the Free Software Foundation; either version 2 of the License, or +# # (at your option) any later version. +# # +# # This program 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 General Public License for more details. +# # +# # You should have received a copy of the GNU General Public License +# # along with this program; if not, write to the Free Software +# # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# # +# # Author: Li Wang <liw...@redhat.com> +# #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +trap tst_exit INT + +export TPATH="$PWD" +export THP_ENABLED="/sys/kernel/mm/transparent_hugepage/enabled" +export USE_ZERO_PAGE="/sys/kernel/mm/transparent_hugepage/use_zero_page" + +hzp=-1 + +hzp_on() +{ + echo 1 >$USE_ZERO_PAGE + if [ $? -ne 0 ]; then + tst_brkm TBROK "turn on hzp failed." + fi +} + +hzp_off() +{ + echo 0 >$USE_ZERO_PAGE + if [ $? -ne 0 ]; then + tst_brkm TBROK "turn off hzp failed." + fi +} + +hzp_setup() +{ + tst_require_root + + # Check to see huge zero page feature is supported or not + if [ ! -f $USE_ZERO_PAGE ];then + tst_brkm TCONF "The huge zero page is not supported. Skip the test..." + fi + + echo always >$THP_ENABLED + if [ $? -ne 0 ]; then + tst_brkm TBROK "Enable the THP option failed." + fi + + # Save the original value of $USE_ZERO_PAGE + hzp=`cat $USE_ZERO_PAGE` + + tst_tmpdir +} + +hzp_cleanup() +{ + tst_resm TINFO "hzp cleanup." + + # Reset the $USE_ZERO_PAGE to original value + echo $hzp >$USE_ZERO_PAGE + rm -f *.log + + tst_rmdir +} diff --git a/testcases/kernel/mem/thp/hzp/memcmp01.c b/testcases/kernel/mem/thp/hzp/memcmp01.c new file mode 100644 index 0000000..2faba78 --- /dev/null +++ b/testcases/kernel/mem/thp/hzp/memcmp01.c @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2015 Linux Test Project. + * + * Author: Kirill A. Shutemov <kirill.shute...@linux.intel.com> + * Modify: Li Wang <liw...@redhat.com> + * + */ + +#include <stdio.h> +#include <string.h> +#include <assert.h> +#include <stdlib.h> +#include <unistd.h> + +#define MB (1UL << 20) + +#ifdef __i386__ || __x86_64__ +#define HPAGE_SIZE (2 * MB) + +#elif __powerpc__ || __powerpc64__ +#define HPAGE_SIZE (16 * MB) + +#elif __s390__ || __s390x__ +#define HPAGE_SIZE (1 * MB) + +#else +#define HPAGE_SIZE (2 * MB) +#endif + +int main(void) +{ + char *p; + unsigned long i; + int ret; + + ret = posix_memalign((void **)&p, HPAGE_SIZE, 100 * HPAGE_SIZE); + if (ret) { + fprintf(stderr, "posix_memalign: %s\n", + strerror(ret)); + return -1; + } + + for (i = 0; i < 100 * HPAGE_SIZE; i += 4096) + assert(p[i] == 0); + pause(); + return 0; +} diff --git a/testcases/kernel/mem/thp/hzp/memcmp02.c b/testcases/kernel/mem/thp/hzp/memcmp02.c new file mode 100644 index 0000000..2bbb116 --- /dev/null +++ b/testcases/kernel/mem/thp/hzp/memcmp02.c @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2015 Linux Test Project. + * + * Author: Kirill A. Shutemov <kirill.shute...@linux.intel.com> + * Modify: Li Wang <liw...@redhat.com> + * + */ + +#include <assert.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <unistd.h> + +#define MB (1UL << 20) +#define GB (1UL << 30) + +#ifdef __i386__ || __x86_64__ +#define HPAGE_SIZE (2 * MB) + +#elif __powerpc__ || __powerpc64__ +#define HPAGE_SIZE (16 * MB) + +#elif __s390__ || __s390x__ +#define HPAGE_SIZE (1 * MB) + +#else +#define HPAGE_SIZE (2 * MB) +#endif + +int main(int argc, char **argv) +{ + char *p; + int i, ret; + int N = atoi(argv[1]); + + if (N < 1) { + fprintf(stderr, "Invalid argument\n"); + exit(1); + } + + ret = posix_memalign((void **)&p, HPAGE_SIZE, N * GB); + if (ret) { + fprintf(stderr, "posix_memalign: %s\n", + strerror(ret)); + return -1; + } + + for (i = 0; i < 1000; i++) { + char *_p = p; + + while (_p < p+N/2*GB) { + assert(*_p == *(_p+N/2*GB)); + _p += 4096; + asm volatile ("" : : : "memory"); + } + } + + free(p); + + return 0; +} -- 1.8.3.1 ------------------------------------------------------------------------------ _______________________________________________ Ltp-list mailing list Ltp-list@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ltp-list