33776141b8
Introduce process_mrelease syscall sanity tests which include tests which expect to fail: - process_mrelease with invalid pidfd and flags inputs - process_mrelease on a live process with no pending signals and valid process_mrelease usage which is expected to succeed. Because process_mrelease has to be used against a process with a pending SIGKILL, it's possible that the process exits before process_mrelease gets called. In such cases we retry the test with a victim that allocates twice more memory up to 1GB. This would require the victim process to spend more time during exit and process_mrelease has a better chance of catching the process before it exits and succeeding. On success the test reports the amount of memory the child had to allocate for reaping to succeed. Sample output: $ mrelease_test Success reaping a child with 1MB of memory allocations On failure the test reports the failure. Sample outputs: $ mrelease_test All process_mrelease attempts failed! $ mrelease_test process_mrelease: Invalid argument Link: https://lkml.kernel.org/r/20220518204316.13131-1-surenb@google.com Signed-off-by: Suren Baghdasaryan <surenb@google.com> Reviewed-by: Shuah Khan <skhan@linuxfoundation.org> Acked-by: Christian Brauner (Microsoft) <brauner@kernel.org> Reviewed-by: Muhammad Usama Anjum <usama.anjum@collabora.com> Cc: Michal Hocko <mhocko@suse.com> Cc: David Rientjes <rientjes@google.com> Cc: Matthew Wilcox (Oracle) <willy@infradead.org> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Roman Gushchin <guro@fb.com> Cc: Minchan Kim <minchan@kernel.org> Cc: "Kirill A . Shutemov" <kirill@shutemov.name> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Christoph Hellwig <hch@infradead.org> Cc: Oleg Nesterov <oleg@redhat.com> Cc: David Hildenbrand <david@redhat.com> Cc: Jann Horn <jannh@google.com> Cc: Shakeel Butt <shakeelb@google.com> Cc: Peter Xu <peterx@redhat.com> Cc: John Hubbard <jhubbard@nvidia.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
183 lines
4.5 KiB
Bash
Executable File
183 lines
4.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
#please run as root
|
|
|
|
# Kselftest framework requirement - SKIP code is 4.
|
|
ksft_skip=4
|
|
|
|
mnt=./huge
|
|
exitcode=0
|
|
|
|
#get huge pagesize and freepages from /proc/meminfo
|
|
while read -r name size unit; do
|
|
if [ "$name" = "HugePages_Free:" ]; then
|
|
freepgs="$size"
|
|
fi
|
|
if [ "$name" = "Hugepagesize:" ]; then
|
|
hpgsize_KB="$size"
|
|
fi
|
|
done < /proc/meminfo
|
|
|
|
# Simple hugetlbfs tests have a hardcoded minimum requirement of
|
|
# huge pages totaling 256MB (262144KB) in size. The userfaultfd
|
|
# hugetlb test requires a minimum of 2 * nr_cpus huge pages. Take
|
|
# both of these requirements into account and attempt to increase
|
|
# number of huge pages available.
|
|
nr_cpus=$(nproc)
|
|
hpgsize_MB=$((hpgsize_KB / 1024))
|
|
half_ufd_size_MB=$((((nr_cpus * hpgsize_MB + 127) / 128) * 128))
|
|
needmem_KB=$((half_ufd_size_MB * 2 * 1024))
|
|
|
|
#set proper nr_hugepages
|
|
if [ -n "$freepgs" ] && [ -n "$hpgsize_KB" ]; then
|
|
nr_hugepgs=$(cat /proc/sys/vm/nr_hugepages)
|
|
needpgs=$((needmem_KB / hpgsize_KB))
|
|
tries=2
|
|
while [ "$tries" -gt 0 ] && [ "$freepgs" -lt "$needpgs" ]; do
|
|
lackpgs=$((needpgs - freepgs))
|
|
echo 3 > /proc/sys/vm/drop_caches
|
|
if ! echo $((lackpgs + nr_hugepgs)) > /proc/sys/vm/nr_hugepages; then
|
|
echo "Please run this test as root"
|
|
exit $ksft_skip
|
|
fi
|
|
while read -r name size unit; do
|
|
if [ "$name" = "HugePages_Free:" ]; then
|
|
freepgs=$size
|
|
fi
|
|
done < /proc/meminfo
|
|
tries=$((tries - 1))
|
|
done
|
|
if [ "$freepgs" -lt "$needpgs" ]; then
|
|
printf "Not enough huge pages available (%d < %d)\n" \
|
|
"$freepgs" "$needpgs"
|
|
exit 1
|
|
fi
|
|
else
|
|
echo "no hugetlbfs support in kernel?"
|
|
exit 1
|
|
fi
|
|
|
|
#filter 64bit architectures
|
|
ARCH64STR="arm64 ia64 mips64 parisc64 ppc64 ppc64le riscv64 s390x sh64 sparc64 x86_64"
|
|
if [ -z "$ARCH" ]; then
|
|
ARCH=$(uname -m 2>/dev/null | sed -e 's/aarch64.*/arm64/')
|
|
fi
|
|
VADDR64=0
|
|
echo "$ARCH64STR" | grep "$ARCH" && VADDR64=1
|
|
|
|
# Usage: run_test [test binary] [arbitrary test arguments...]
|
|
run_test() {
|
|
local title="running $*"
|
|
local sep=$(echo -n "$title" | tr "[:graph:][:space:]" -)
|
|
printf "%s\n%s\n%s\n" "$sep" "$title" "$sep"
|
|
|
|
"$@"
|
|
local ret=$?
|
|
if [ $ret -eq 0 ]; then
|
|
echo "[PASS]"
|
|
elif [ $ret -eq $ksft_skip ]; then
|
|
echo "[SKIP]"
|
|
exitcode=$ksft_skip
|
|
else
|
|
echo "[FAIL]"
|
|
exitcode=1
|
|
fi
|
|
}
|
|
|
|
mkdir "$mnt"
|
|
mount -t hugetlbfs none "$mnt"
|
|
|
|
run_test ./hugepage-mmap
|
|
|
|
shmmax=$(cat /proc/sys/kernel/shmmax)
|
|
shmall=$(cat /proc/sys/kernel/shmall)
|
|
echo 268435456 > /proc/sys/kernel/shmmax
|
|
echo 4194304 > /proc/sys/kernel/shmall
|
|
run_test ./hugepage-shm
|
|
echo "$shmmax" > /proc/sys/kernel/shmmax
|
|
echo "$shmall" > /proc/sys/kernel/shmall
|
|
|
|
run_test ./map_hugetlb
|
|
|
|
run_test ./hugepage-mremap "$mnt"/huge_mremap
|
|
rm -f "$mnt"/huge_mremap
|
|
|
|
run_test ./hugepage-vmemmap
|
|
|
|
run_test ./hugetlb-madvise "$mnt"/madvise-test
|
|
rm -f "$mnt"/madvise-test
|
|
|
|
echo "NOTE: The above hugetlb tests provide minimal coverage. Use"
|
|
echo " https://github.com/libhugetlbfs/libhugetlbfs.git for"
|
|
echo " hugetlb regression testing."
|
|
|
|
run_test ./map_fixed_noreplace
|
|
|
|
# get_user_pages_fast() benchmark
|
|
run_test ./gup_test -u
|
|
# pin_user_pages_fast() benchmark
|
|
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
|
|
|
|
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
|
|
|
|
run_test ./compaction_test
|
|
|
|
run_test sudo -u nobody ./on-fault-limit
|
|
|
|
run_test ./map_populate
|
|
|
|
run_test ./mlock-random-test
|
|
|
|
run_test ./mlock2-tests
|
|
|
|
run_test ./mrelease_test
|
|
|
|
run_test ./mremap_test
|
|
|
|
run_test ./thuge-gen
|
|
|
|
if [ $VADDR64 -ne 0 ]; then
|
|
run_test ./virtual_address_range
|
|
|
|
# virtual address 128TB switch test
|
|
run_test ./va_128TBswitch
|
|
fi # VADDR64
|
|
|
|
# vmalloc stability smoke test
|
|
run_test ./test_vmalloc.sh smoke
|
|
|
|
run_test ./mremap_dontunmap
|
|
|
|
run_test ./test_hmm.sh smoke
|
|
|
|
# MADV_POPULATE_READ and MADV_POPULATE_WRITE tests
|
|
run_test ./madv_populate
|
|
|
|
run_test ./memfd_secret
|
|
|
|
# KSM MADV_MERGEABLE test with 10 identical pages
|
|
run_test ./ksm_tests -M -p 10
|
|
# KSM unmerge test
|
|
run_test ./ksm_tests -U
|
|
# KSM test with 10 zero pages and use_zero_pages = 0
|
|
run_test ./ksm_tests -Z -p 10 -z 0
|
|
# KSM test with 10 zero pages and use_zero_pages = 1
|
|
run_test ./ksm_tests -Z -p 10 -z 1
|
|
# KSM test with 2 NUMA nodes and merge_across_nodes = 1
|
|
run_test ./ksm_tests -N -m 1
|
|
# KSM test with 2 NUMA nodes and merge_across_nodes = 0
|
|
run_test ./ksm_tests -N -m 0
|
|
|
|
exit $exitcode
|