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