From nobody Sun Apr 19 05:32:03 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4694FC43334 for ; Tue, 5 Jul 2022 18:56:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232958AbiGES4g (ORCPT ); Tue, 5 Jul 2022 14:56:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58148 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229872AbiGES4e (ORCPT ); Tue, 5 Jul 2022 14:56:34 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 869851CB08 for ; Tue, 5 Jul 2022 11:56:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1657047392; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=sm1YrHRBQ1QJZPUgeEFq2SDAcSXhEPRjCPtrFv/MFMc=; b=Tz097NjA1EUk3DZt4dy5o/HHN77qxt3NlCQo8TDSnt5Za1TLAqjKg6OmzWrvJvi8VZ/0q5 9OF06fixVDERuLhfYktVOysDvbUm75DiaXzMfs6JqsLhVQHVd/Az3vckaapjNiHSe/8ZCI 380WiLQkfM/dyN5glqT80ojOkN6zp6E= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-564-QHAjEgnNNXSdPzZon_ZNkg-1; Tue, 05 Jul 2022 14:56:25 -0400 X-MC-Unique: QHAjEgnNNXSdPzZon_ZNkg-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 48162811E80; Tue, 5 Jul 2022 18:56:25 +0000 (UTC) Received: from jsavitz-csb.redhat.com (unknown [10.22.34.192]) by smtp.corp.redhat.com (Postfix) with ESMTP id EA7FE4050C50; Tue, 5 Jul 2022 18:56:24 +0000 (UTC) From: Joel Savitz To: linux-kernel@vger.kernel.org Cc: Joel Savitz , Andrew Morton , Shuah Khan , linux-mm@kvack.org, linux-kselftest@vger.kernel.org, Nico Pache Subject: [PATCH] selftests/vm: enable running select groups of tests Date: Tue, 5 Jul 2022 14:56:05 -0400 Message-Id: <20220705185605.3889110-1-jsavitz@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.84 on 10.11.54.2 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add the ability to run one or more groups of vm tests (specified by the environment variable TEST_ITEMS). Preserve existing default behavior of running all tests when TEST_ITEMS is empty or "default". Documentation of test groups is included in the patch as follows: # ./run_vmtests.sh [ -h || --help ] usage: ./tools/testing/selftests/vm/run_vmtests.sh [ -h ] -h: display this message The default behavior is to run all tests. Alternatively, specific groups tests can be run by defining the TEST_ITEMS shell variable with a space-separated string of one or more of the following: - mmap tests for mmap(2) - gup_test tests for gup using gup_test interface - userfaultfd tests for userfaultfd(2) - compaction a test for the patch "Allow compaction of unevictable pages" - mlock tests for mlock(2) - mremap tests for mremap(2) - hugevm tests for very large virtual address space - vmalloc vmalloc smoke tests - hmm hmm smoke tests - madv_populate test memadvise(2) MADV_POPULATE_{READ,WRITE} options - memfd_secret test memfd_secret(2) - process_mrelease test process_mrelease(2) - ksm ksm tests that do not require >=3D2 NUMA nodes - ksm_numa ksm tests that require >=3D2 NUMA nodes example: TEST_ITEMS=3D"hmm mmap ksm" ./run_vmtests.sh Signed-off-by: Joel Savitz --- tools/testing/selftests/vm/run_vmtests.sh | 224 +++++++++++++++------- 1 file changed, 150 insertions(+), 74 deletions(-) diff --git a/tools/testing/selftests/vm/run_vmtests.sh b/tools/testing/self= tests/vm/run_vmtests.sh index 41fce8bea929..d31fc66205f8 100755 --- a/tools/testing/selftests/vm/run_vmtests.sh +++ b/tools/testing/selftests/vm/run_vmtests.sh @@ -1,22 +1,74 @@ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 -#please run as root +# Please run as root =20 # Kselftest framework requirement - SKIP code is 4. ksft_skip=3D4 =20 mnt=3D./huge exitcode=3D0 - -#get huge pagesize and freepages from /proc/meminfo -while read -r name size unit; do - if [ "$name" =3D "HugePages_Free:" ]; then - freepgs=3D"$size" - fi - if [ "$name" =3D "Hugepagesize:" ]; then - hpgsize_KB=3D"$size" +nr_tests_ran=3D0 + +if [ ${1:-0} =3D=3D "-h" ] || [ ${1:-0} =3D=3D "--help" ] +then + cat <=3D2 NUMA nodes +- ksm_numa + ksm tests that require >=3D2 NUMA nodes +example: TEST_ITEMS=3D"hmm mmap ksm" ./run_vmtests.sh +EOF + exit 0 +fi # $1 =3D=3D -h || $1 =3D=3D --help + +# default behavior: run all tests +TEST_ITEMS=3D${TEST_ITEMS:-default} + +echo "Selected test items: ${TEST_ITEMS}" + +test_selected() { + if [ "$TEST_ITEMS" =3D=3D "default" ]; then + # If no TEST_ITEMS are specified, run all tests + return 0 fi -done < /proc/meminfo + echo ${TEST_ITEMS} | grep ${1} 2>&1 >/dev/null + return ${?} +} + +# Hugepage setup only needed for hugetlb tests +if test_selected "hugetlb"; then =20 # Simple hugetlbfs tests have a hardcoded minimum requirement of # huge pages totaling 256MB (262144KB) in size. The userfaultfd @@ -28,7 +80,17 @@ hpgsize_MB=3D$((hpgsize_KB / 1024)) half_ufd_size_MB=3D$((((nr_cpus * hpgsize_MB + 127) / 128) * 128)) needmem_KB=3D$((half_ufd_size_MB * 2 * 1024)) =20 -#set proper nr_hugepages +# get huge pagesize and freepages from /proc/meminfo +while read -r name size unit; do + if [ "$name" =3D "HugePages_Free:" ]; then + freepgs=3D"$size" + fi + if [ "$name" =3D "Hugepagesize:" ]; then + hpgsize_KB=3D"$size" + fi +done < /proc/meminfo + +# set proper nr_hugepages if [ -n "$freepgs" ] && [ -n "$hpgsize_KB" ]; then nr_hugepgs=3D$(cat /proc/sys/vm/nr_hugepages) needpgs=3D$((needmem_KB / hpgsize_KB)) @@ -57,126 +119,140 @@ else exit 1 fi =20 -#filter 64bit architectures +fi # test_selected "hugetlb" + +# filter 64bit architectures ARCH64STR=3D"arm64 ia64 mips64 parisc64 ppc64 ppc64le riscv64 s390x sh64 s= parc64 x86_64" if [ -z "$ARCH" ]; then ARCH=3D$(uname -m 2>/dev/null | sed -e 's/aarch64.*/arm64/') fi VADDR64=3D0 -echo "$ARCH64STR" | grep "$ARCH" && VADDR64=3D1 +echo "$ARCH64STR" | grep "$ARCH" &>/dev/null && VADDR64=3D1 =20 # Usage: run_test [test binary] [arbitrary test arguments...] run_test() { - local title=3D"running $*" - local sep=3D$(echo -n "$title" | tr "[:graph:][:space:]" -) - printf "%s\n%s\n%s\n" "$sep" "$title" "$sep" - - "$@" - local ret=3D$? - if [ $ret -eq 0 ]; then - echo "[PASS]" - elif [ $ret -eq $ksft_skip ]; then - echo "[SKIP]" - exitcode=3D$ksft_skip - else - echo "[FAIL]" - exitcode=3D1 - fi + if test_selected ${CATEGORY}; then + local title=3D"running $*" + local sep=3D$(echo -n "$title" | tr "[:graph:][:space:]" -) + printf "%s\n%s\n%s\n" "$sep" "$title" "$sep" + + "$@" + local ret=3D$? + if [ $ret -eq 0 ]; then + echo "[PASS]" + elif [ $ret -eq $ksft_skip ]; then + echo "[SKIP]" + exitcode=3D$ksft_skip + else + echo "[FAIL]" + exitcode=3D1 + fi + nr_tests_ran=3D$((nr_tests_ran + 1)) + fi # test_selected } =20 -mkdir "$mnt" -mount -t hugetlbfs none "$mnt" +# setup only needed for hugetlb tests +if test_selected "hugetlb"; then + mkdir "$mnt" + mount -t hugetlbfs none "$mnt" +fi =20 -run_test ./hugepage-mmap +CATEGORY=3D"hugetlb" run_test ./hugepage-mmap =20 shmmax=3D$(cat /proc/sys/kernel/shmmax) shmall=3D$(cat /proc/sys/kernel/shmall) echo 268435456 > /proc/sys/kernel/shmmax echo 4194304 > /proc/sys/kernel/shmall -run_test ./hugepage-shm +CATEGORY=3D"hugetlb" run_test ./hugepage-shm echo "$shmmax" > /proc/sys/kernel/shmmax echo "$shmall" > /proc/sys/kernel/shmall =20 -run_test ./map_hugetlb +CATEGORY=3D"hugetlb" run_test ./map_hugetlb =20 -run_test ./hugepage-mremap "$mnt"/huge_mremap -rm -f "$mnt"/huge_mremap +CATEGORY=3D"hugetlb" run_test ./hugepage-mremap "$mnt"/huge_mremap +test_selected "hugetlb" && rm -f "$mnt"/huge_mremap =20 -run_test ./hugepage-vmemmap +CATEGORY=3D"hugetlb" run_test ./hugepage-vmemmap =20 -run_test ./hugetlb-madvise "$mnt"/madvise-test -rm -f "$mnt"/madvise-test +CATEGORY=3D"hugetlb" run_test ./hugetlb-madvise "$mnt"/madvise-test +test_selected "hugetlb" && rm -f "$mnt"/madvise-test =20 -echo "NOTE: The above hugetlb tests provide minimal coverage. Use" -echo " https://github.com/libhugetlbfs/libhugetlbfs.git for" -echo " hugetlb regression testing." +if test_selected "hugetlb"; then + echo "NOTE: These hugetlb tests provide minimal coverage. Use" + echo " https://github.com/libhugetlbfs/libhugetlbfs.git for" + echo " hugetlb regression testing." +fi =20 -run_test ./map_fixed_noreplace +CATEGORY=3D"mmap" run_test ./map_fixed_noreplace =20 # get_user_pages_fast() benchmark -run_test ./gup_test -u +CATEGORY=3D"gup_test" run_test ./gup_test -u # pin_user_pages_fast() benchmark -run_test ./gup_test -a +CATEGORY=3D"gup_test" run_test ./gup_test -a # Dump pages 0, 19, and 4096, using pin_user_pages: -run_test ./gup_test -ct -F 0x1 0 19 0x1000 +CATEGORY=3D"gup_test" run_test ./gup_test -ct -F 0x1 0 19 0x1000 =20 -run_test ./userfaultfd anon 20 16 +CATEGORY=3D"userfaultfd" run_test ./userfaultfd anon 20 16 # Test requires source and destination huge pages. Size of source # (half_ufd_size_MB) is passed as argument to test. -run_test ./userfaultfd hugetlb "$half_ufd_size_MB" 32 -run_test ./userfaultfd shmem 20 16 - -#cleanup -umount "$mnt" -rm -rf "$mnt" -echo "$nr_hugepgs" > /proc/sys/vm/nr_hugepages +CATEGORY=3D"userfaultfd" run_test ./userfaultfd hugetlb "$half_ufd_size_MB= " 32 +CATEGORY=3D"userfaultfd" run_test ./userfaultfd shmem 20 16 + +# cleanup (only needed when running hugetlb tests) +if test_selected "hugetlb"; then + umount "$mnt" + rm -rf "$mnt" + echo "$nr_hugepgs" > /proc/sys/vm/nr_hugepages +fi =20 -run_test ./compaction_test +CATEGORY=3D"compaction" run_test ./compaction_test =20 -run_test sudo -u nobody ./on-fault-limit +CATEGORY=3D"mlock" run_test sudo -u nobody ./on-fault-limit =20 -run_test ./map_populate +CATEGORY=3D"mmap" run_test ./map_populate =20 -run_test ./mlock-random-test +CATEGORY=3D"mlock" run_test ./mlock-random-test =20 -run_test ./mlock2-tests +CATEGORY=3D"mlock" run_test ./mlock2-tests =20 -run_test ./mrelease_test +CATEGORY=3D"process_mrelease" run_test ./mrelease_test =20 -run_test ./mremap_test +CATEGORY=3D"mremap" run_test ./mremap_test =20 -run_test ./thuge-gen +CATEGORY=3D"hugetlb" run_test ./thuge-gen =20 if [ $VADDR64 -ne 0 ]; then - run_test ./virtual_address_range + CATEGORY=3D"hugevm" run_test ./virtual_address_range =20 # virtual address 128TB switch test - run_test ./va_128TBswitch + CATEGORY=3D"hugevm" run_test ./va_128TBswitch fi # VADDR64 =20 # vmalloc stability smoke test -run_test ./test_vmalloc.sh smoke +CATEGORY=3D"vmalloc" run_test ./test_vmalloc.sh smoke =20 -run_test ./mremap_dontunmap +CATEGORY=3D"mremap" run_test ./mremap_dontunmap =20 -run_test ./test_hmm.sh smoke +CATEGORY=3D"hmm" run_test ./test_hmm.sh smoke =20 # MADV_POPULATE_READ and MADV_POPULATE_WRITE tests -run_test ./madv_populate +CATEGORY=3D"madv_populate" run_test ./madv_populate =20 -run_test ./memfd_secret +CATEGORY=3D"memfd_secret" run_test ./memfd_secret =20 # KSM MADV_MERGEABLE test with 10 identical pages -run_test ./ksm_tests -M -p 10 +CATEGORY=3D"ksm" run_test ./ksm_tests -M -p 10 # KSM unmerge test -run_test ./ksm_tests -U +CATEGORY=3D"ksm" run_test ./ksm_tests -U # KSM test with 10 zero pages and use_zero_pages =3D 0 -run_test ./ksm_tests -Z -p 10 -z 0 +CATEGORY=3D"ksm" run_test ./ksm_tests -Z -p 10 -z 0 # KSM test with 10 zero pages and use_zero_pages =3D 1 -run_test ./ksm_tests -Z -p 10 -z 1 +CATEGORY=3D"ksm" run_test ./ksm_tests -Z -p 10 -z 1 # KSM test with 2 NUMA nodes and merge_across_nodes =3D 1 -run_test ./ksm_tests -N -m 1 +CATEGORY=3D"ksm_numa" run_test ./ksm_tests -N -m 1 # KSM test with 2 NUMA nodes and merge_across_nodes =3D 0 -run_test ./ksm_tests -N -m 0 +CATEGORY=3D"ksm_numa" run_test ./ksm_tests -N -m 0 + +echo "Ran $nr_tests_ran tests" =20 exit $exitcode --=20 2.31.1