162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci#
462306a36Sopenharmony_ci# Copyright (C) 2018 Uladzislau Rezki (Sony) <urezki@gmail.com>
562306a36Sopenharmony_ci#
662306a36Sopenharmony_ci# This is a test script for the kernel test driver to analyse vmalloc
762306a36Sopenharmony_ci# allocator. Therefore it is just a kernel module loader. You can specify
862306a36Sopenharmony_ci# and pass different parameters in order to:
962306a36Sopenharmony_ci#     a) analyse performance of vmalloc allocations;
1062306a36Sopenharmony_ci#     b) stressing and stability check of vmalloc subsystem.
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciTEST_NAME="vmalloc"
1362306a36Sopenharmony_ciDRIVER="test_${TEST_NAME}"
1462306a36Sopenharmony_ciNUM_CPUS=`grep -c ^processor /proc/cpuinfo`
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci# 1 if fails
1762306a36Sopenharmony_ciexitcode=1
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci# Kselftest framework requirement - SKIP code is 4.
2062306a36Sopenharmony_ciksft_skip=4
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#
2362306a36Sopenharmony_ci# Static templates for performance, stressing and smoke tests.
2462306a36Sopenharmony_ci# Also it is possible to pass any supported parameters manualy.
2562306a36Sopenharmony_ci#
2662306a36Sopenharmony_ciPERF_PARAM="sequential_test_order=1 test_repeat_count=3"
2762306a36Sopenharmony_ciSMOKE_PARAM="test_loop_count=10000 test_repeat_count=10"
2862306a36Sopenharmony_ciSTRESS_PARAM="nr_threads=$NUM_CPUS test_repeat_count=20"
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cicheck_test_requirements()
3162306a36Sopenharmony_ci{
3262306a36Sopenharmony_ci	uid=$(id -u)
3362306a36Sopenharmony_ci	if [ $uid -ne 0 ]; then
3462306a36Sopenharmony_ci		echo "$0: Must be run as root"
3562306a36Sopenharmony_ci		exit $ksft_skip
3662306a36Sopenharmony_ci	fi
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	if ! which modprobe > /dev/null 2>&1; then
3962306a36Sopenharmony_ci		echo "$0: You need modprobe installed"
4062306a36Sopenharmony_ci		exit $ksft_skip
4162306a36Sopenharmony_ci	fi
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci	if ! modinfo $DRIVER > /dev/null 2>&1; then
4462306a36Sopenharmony_ci		echo "$0: You must have the following enabled in your kernel:"
4562306a36Sopenharmony_ci		echo "CONFIG_TEST_VMALLOC=m"
4662306a36Sopenharmony_ci		exit $ksft_skip
4762306a36Sopenharmony_ci	fi
4862306a36Sopenharmony_ci}
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_cirun_perfformance_check()
5162306a36Sopenharmony_ci{
5262306a36Sopenharmony_ci	echo "Run performance tests to evaluate how fast vmalloc allocation is."
5362306a36Sopenharmony_ci	echo "It runs all test cases on one single CPU with sequential order."
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci	modprobe $DRIVER $PERF_PARAM > /dev/null 2>&1
5662306a36Sopenharmony_ci	echo "Done."
5762306a36Sopenharmony_ci	echo "Ccheck the kernel message buffer to see the summary."
5862306a36Sopenharmony_ci}
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cirun_stability_check()
6162306a36Sopenharmony_ci{
6262306a36Sopenharmony_ci	echo "Run stability tests. In order to stress vmalloc subsystem all"
6362306a36Sopenharmony_ci	echo "available test cases are run by NUM_CPUS workers simultaneously."
6462306a36Sopenharmony_ci	echo "It will take time, so be patient."
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	modprobe $DRIVER $STRESS_PARAM > /dev/null 2>&1
6762306a36Sopenharmony_ci	echo "Done."
6862306a36Sopenharmony_ci	echo "Check the kernel ring buffer to see the summary."
6962306a36Sopenharmony_ci}
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_cirun_smoke_check()
7262306a36Sopenharmony_ci{
7362306a36Sopenharmony_ci	echo "Run smoke test. Note, this test provides basic coverage."
7462306a36Sopenharmony_ci	echo "Please check $0 output how it can be used"
7562306a36Sopenharmony_ci	echo "for deep performance analysis as well as stress testing."
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci	modprobe $DRIVER $SMOKE_PARAM > /dev/null 2>&1
7862306a36Sopenharmony_ci	echo "Done."
7962306a36Sopenharmony_ci	echo "Check the kernel ring buffer to see the summary."
8062306a36Sopenharmony_ci}
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ciusage()
8362306a36Sopenharmony_ci{
8462306a36Sopenharmony_ci	echo -n "Usage: $0 [ performance ] | [ stress ] | | [ smoke ] | "
8562306a36Sopenharmony_ci	echo "manual parameters"
8662306a36Sopenharmony_ci	echo
8762306a36Sopenharmony_ci	echo "Valid tests and parameters:"
8862306a36Sopenharmony_ci	echo
8962306a36Sopenharmony_ci	modinfo $DRIVER
9062306a36Sopenharmony_ci	echo
9162306a36Sopenharmony_ci	echo "Example usage:"
9262306a36Sopenharmony_ci	echo
9362306a36Sopenharmony_ci	echo "# Shows help message"
9462306a36Sopenharmony_ci	echo "./${DRIVER}.sh"
9562306a36Sopenharmony_ci	echo
9662306a36Sopenharmony_ci	echo "# Runs 1 test(id_1), repeats it 5 times by NUM_CPUS workers"
9762306a36Sopenharmony_ci	echo "./${DRIVER}.sh nr_threads=$NUM_CPUS run_test_mask=1 test_repeat_count=5"
9862306a36Sopenharmony_ci	echo
9962306a36Sopenharmony_ci	echo -n "# Runs 4 tests(id_1|id_2|id_4|id_16) on one CPU with "
10062306a36Sopenharmony_ci	echo "sequential order"
10162306a36Sopenharmony_ci	echo -n "./${DRIVER}.sh sequential_test_order=1 "
10262306a36Sopenharmony_ci	echo "run_test_mask=23"
10362306a36Sopenharmony_ci	echo
10462306a36Sopenharmony_ci	echo -n "# Runs all tests by NUM_CPUS workers, shuffled order, repeats "
10562306a36Sopenharmony_ci	echo "20 times"
10662306a36Sopenharmony_ci	echo "./${DRIVER}.sh nr_threads=$NUM_CPUS test_repeat_count=20"
10762306a36Sopenharmony_ci	echo
10862306a36Sopenharmony_ci	echo "# Performance analysis"
10962306a36Sopenharmony_ci	echo "./${DRIVER}.sh performance"
11062306a36Sopenharmony_ci	echo
11162306a36Sopenharmony_ci	echo "# Stress testing"
11262306a36Sopenharmony_ci	echo "./${DRIVER}.sh stress"
11362306a36Sopenharmony_ci	echo
11462306a36Sopenharmony_ci	exit 0
11562306a36Sopenharmony_ci}
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_cifunction validate_passed_args()
11862306a36Sopenharmony_ci{
11962306a36Sopenharmony_ci	VALID_ARGS=`modinfo $DRIVER | awk '/parm:/ {print $2}' | sed 's/:.*//'`
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci	#
12262306a36Sopenharmony_ci	# Something has been passed, check it.
12362306a36Sopenharmony_ci	#
12462306a36Sopenharmony_ci	for passed_arg in $@; do
12562306a36Sopenharmony_ci		key=${passed_arg//=*/}
12662306a36Sopenharmony_ci		val="${passed_arg:$((${#key}+1))}"
12762306a36Sopenharmony_ci		valid=0
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci		for valid_arg in $VALID_ARGS; do
13062306a36Sopenharmony_ci			if [[ $key = $valid_arg ]] && [[ $val -gt 0 ]]; then
13162306a36Sopenharmony_ci				valid=1
13262306a36Sopenharmony_ci				break
13362306a36Sopenharmony_ci			fi
13462306a36Sopenharmony_ci		done
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci		if [[ $valid -ne 1 ]]; then
13762306a36Sopenharmony_ci			echo "Error: key or value is not correct: ${key} $val"
13862306a36Sopenharmony_ci			exit $exitcode
13962306a36Sopenharmony_ci		fi
14062306a36Sopenharmony_ci	done
14162306a36Sopenharmony_ci}
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_cifunction run_manual_check()
14462306a36Sopenharmony_ci{
14562306a36Sopenharmony_ci	#
14662306a36Sopenharmony_ci	# Validate passed parameters. If there is wrong one,
14762306a36Sopenharmony_ci	# the script exists and does not execute further.
14862306a36Sopenharmony_ci	#
14962306a36Sopenharmony_ci	validate_passed_args $@
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci	echo "Run the test with following parameters: $@"
15262306a36Sopenharmony_ci	modprobe $DRIVER $@ > /dev/null 2>&1
15362306a36Sopenharmony_ci	echo "Done."
15462306a36Sopenharmony_ci	echo "Check the kernel ring buffer to see the summary."
15562306a36Sopenharmony_ci}
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_cifunction run_test()
15862306a36Sopenharmony_ci{
15962306a36Sopenharmony_ci	if [ $# -eq 0 ]; then
16062306a36Sopenharmony_ci		usage
16162306a36Sopenharmony_ci	else
16262306a36Sopenharmony_ci		if [[ "$1" = "performance" ]]; then
16362306a36Sopenharmony_ci			run_perfformance_check
16462306a36Sopenharmony_ci		elif [[ "$1" = "stress" ]]; then
16562306a36Sopenharmony_ci			run_stability_check
16662306a36Sopenharmony_ci		elif [[ "$1" = "smoke" ]]; then
16762306a36Sopenharmony_ci			run_smoke_check
16862306a36Sopenharmony_ci		else
16962306a36Sopenharmony_ci			run_manual_check $@
17062306a36Sopenharmony_ci		fi
17162306a36Sopenharmony_ci	fi
17262306a36Sopenharmony_ci}
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_cicheck_test_requirements
17562306a36Sopenharmony_cirun_test $@
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ciexit 0
178