#!/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
#
#uffd_mods=("" ":dev")
#for mod in "${uffd_mods[@]}"; do
#	run_test ./userfaultfd anon${mod} 20 16
#	# Hugetlb tests require source and destination huge pages. Pass in half
#	# the size ($half_ufd_size_MB), which is used for *each*.
#	run_test ./userfaultfd hugetlb${mod} "$half_ufd_size_MB" 32
#	run_test ./userfaultfd hugetlb_shared${mod} "$half_ufd_size_MB" 32 "$mnt"/uffd-test
#	rm -f "$mnt"/uffd-test
#	run_test ./userfaultfd shmem${mod} 20 16
#done
#
##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.sh
#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

## protection_keys tests
#if [ -x ./protection_keys_32 ]
#then
#	run_test ./protection_keys_32
#fi
#
#if [ -x ./protection_keys_64 ]
#then
#	run_test ./protection_keys_64
#fi
#
#run_test ./soft-dirty

exit $exitcode
