1*7fef0decSYunsheng Lin#!/bin/bash 2*7fef0decSYunsheng Lin# SPDX-License-Identifier: GPL-2.0 3*7fef0decSYunsheng Lin# 4*7fef0decSYunsheng Lin# Copyright (C) 2024 Yunsheng Lin <linyunsheng@huawei.com> 5*7fef0decSYunsheng Lin# Copyright (C) 2018 Uladzislau Rezki (Sony) <urezki@gmail.com> 6*7fef0decSYunsheng Lin# 7*7fef0decSYunsheng Lin# This is a test script for the kernel test driver to test the 8*7fef0decSYunsheng Lin# correctness and performance of page_frag's implementation. 9*7fef0decSYunsheng Lin# Therefore it is just a kernel module loader. You can specify 10*7fef0decSYunsheng Lin# and pass different parameters in order to: 11*7fef0decSYunsheng Lin# a) analyse performance of page fragment allocations; 12*7fef0decSYunsheng Lin# b) stressing and stability check of page_frag subsystem. 13*7fef0decSYunsheng Lin 14*7fef0decSYunsheng LinDRIVER="./page_frag/page_frag_test.ko" 15*7fef0decSYunsheng LinCPU_LIST=$(grep -m 2 processor /proc/cpuinfo | cut -d ' ' -f 2) 16*7fef0decSYunsheng LinTEST_CPU_0=$(echo $CPU_LIST | awk '{print $1}') 17*7fef0decSYunsheng Lin 18*7fef0decSYunsheng Linif [ $(echo $CPU_LIST | wc -w) -gt 1 ]; then 19*7fef0decSYunsheng Lin TEST_CPU_1=$(echo $CPU_LIST | awk '{print $2}') 20*7fef0decSYunsheng Lin NR_TEST=100000000 21*7fef0decSYunsheng Linelse 22*7fef0decSYunsheng Lin TEST_CPU_1=$TEST_CPU_0 23*7fef0decSYunsheng Lin NR_TEST=1000000 24*7fef0decSYunsheng Linfi 25*7fef0decSYunsheng Lin 26*7fef0decSYunsheng Lin# 1 if fails 27*7fef0decSYunsheng Linexitcode=1 28*7fef0decSYunsheng Lin 29*7fef0decSYunsheng Lin# Kselftest framework requirement - SKIP code is 4. 30*7fef0decSYunsheng Linksft_skip=4 31*7fef0decSYunsheng Lin 32*7fef0decSYunsheng Lincheck_test_failed_prefix() { 33*7fef0decSYunsheng Lin if dmesg | grep -q 'page_frag_test failed:';then 34*7fef0decSYunsheng Lin echo "page_frag_test failed, please check dmesg" 35*7fef0decSYunsheng Lin exit $exitcode 36*7fef0decSYunsheng Lin fi 37*7fef0decSYunsheng Lin} 38*7fef0decSYunsheng Lin 39*7fef0decSYunsheng Lin# 40*7fef0decSYunsheng Lin# Static templates for testing of page_frag APIs. 41*7fef0decSYunsheng Lin# Also it is possible to pass any supported parameters manually. 42*7fef0decSYunsheng Lin# 43*7fef0decSYunsheng LinSMOKE_PARAM="test_push_cpu=$TEST_CPU_0 test_pop_cpu=$TEST_CPU_1" 44*7fef0decSYunsheng LinNONALIGNED_PARAM="$SMOKE_PARAM test_alloc_len=75 nr_test=$NR_TEST" 45*7fef0decSYunsheng LinALIGNED_PARAM="$NONALIGNED_PARAM test_align=1" 46*7fef0decSYunsheng Lin 47*7fef0decSYunsheng Lincheck_test_requirements() 48*7fef0decSYunsheng Lin{ 49*7fef0decSYunsheng Lin uid=$(id -u) 50*7fef0decSYunsheng Lin if [ $uid -ne 0 ]; then 51*7fef0decSYunsheng Lin echo "$0: Must be run as root" 52*7fef0decSYunsheng Lin exit $ksft_skip 53*7fef0decSYunsheng Lin fi 54*7fef0decSYunsheng Lin 55*7fef0decSYunsheng Lin if ! which insmod > /dev/null 2>&1; then 56*7fef0decSYunsheng Lin echo "$0: You need insmod installed" 57*7fef0decSYunsheng Lin exit $ksft_skip 58*7fef0decSYunsheng Lin fi 59*7fef0decSYunsheng Lin 60*7fef0decSYunsheng Lin if [ ! -f $DRIVER ]; then 61*7fef0decSYunsheng Lin echo "$0: You need to compile page_frag_test module" 62*7fef0decSYunsheng Lin exit $ksft_skip 63*7fef0decSYunsheng Lin fi 64*7fef0decSYunsheng Lin} 65*7fef0decSYunsheng Lin 66*7fef0decSYunsheng Linrun_nonaligned_check() 67*7fef0decSYunsheng Lin{ 68*7fef0decSYunsheng Lin echo "Run performance tests to evaluate how fast nonaligned alloc API is." 69*7fef0decSYunsheng Lin 70*7fef0decSYunsheng Lin insmod $DRIVER $NONALIGNED_PARAM > /dev/null 2>&1 71*7fef0decSYunsheng Lin} 72*7fef0decSYunsheng Lin 73*7fef0decSYunsheng Linrun_aligned_check() 74*7fef0decSYunsheng Lin{ 75*7fef0decSYunsheng Lin echo "Run performance tests to evaluate how fast aligned alloc API is." 76*7fef0decSYunsheng Lin 77*7fef0decSYunsheng Lin insmod $DRIVER $ALIGNED_PARAM > /dev/null 2>&1 78*7fef0decSYunsheng Lin} 79*7fef0decSYunsheng Lin 80*7fef0decSYunsheng Linrun_smoke_check() 81*7fef0decSYunsheng Lin{ 82*7fef0decSYunsheng Lin echo "Run smoke test." 83*7fef0decSYunsheng Lin 84*7fef0decSYunsheng Lin insmod $DRIVER $SMOKE_PARAM > /dev/null 2>&1 85*7fef0decSYunsheng Lin} 86*7fef0decSYunsheng Lin 87*7fef0decSYunsheng Linusage() 88*7fef0decSYunsheng Lin{ 89*7fef0decSYunsheng Lin echo -n "Usage: $0 [ aligned ] | [ nonaligned ] | | [ smoke ] | " 90*7fef0decSYunsheng Lin echo "manual parameters" 91*7fef0decSYunsheng Lin echo 92*7fef0decSYunsheng Lin echo "Valid tests and parameters:" 93*7fef0decSYunsheng Lin echo 94*7fef0decSYunsheng Lin modinfo $DRIVER 95*7fef0decSYunsheng Lin echo 96*7fef0decSYunsheng Lin echo "Example usage:" 97*7fef0decSYunsheng Lin echo 98*7fef0decSYunsheng Lin echo "# Shows help message" 99*7fef0decSYunsheng Lin echo "$0" 100*7fef0decSYunsheng Lin echo 101*7fef0decSYunsheng Lin echo "# Smoke testing" 102*7fef0decSYunsheng Lin echo "$0 smoke" 103*7fef0decSYunsheng Lin echo 104*7fef0decSYunsheng Lin echo "# Performance testing for nonaligned alloc API" 105*7fef0decSYunsheng Lin echo "$0 nonaligned" 106*7fef0decSYunsheng Lin echo 107*7fef0decSYunsheng Lin echo "# Performance testing for aligned alloc API" 108*7fef0decSYunsheng Lin echo "$0 aligned" 109*7fef0decSYunsheng Lin echo 110*7fef0decSYunsheng Lin exit 0 111*7fef0decSYunsheng Lin} 112*7fef0decSYunsheng Lin 113*7fef0decSYunsheng Linfunction validate_passed_args() 114*7fef0decSYunsheng Lin{ 115*7fef0decSYunsheng Lin VALID_ARGS=`modinfo $DRIVER | awk '/parm:/ {print $2}' | sed 's/:.*//'` 116*7fef0decSYunsheng Lin 117*7fef0decSYunsheng Lin # 118*7fef0decSYunsheng Lin # Something has been passed, check it. 119*7fef0decSYunsheng Lin # 120*7fef0decSYunsheng Lin for passed_arg in $@; do 121*7fef0decSYunsheng Lin key=${passed_arg//=*/} 122*7fef0decSYunsheng Lin valid=0 123*7fef0decSYunsheng Lin 124*7fef0decSYunsheng Lin for valid_arg in $VALID_ARGS; do 125*7fef0decSYunsheng Lin if [[ $key = $valid_arg ]]; then 126*7fef0decSYunsheng Lin valid=1 127*7fef0decSYunsheng Lin break 128*7fef0decSYunsheng Lin fi 129*7fef0decSYunsheng Lin done 130*7fef0decSYunsheng Lin 131*7fef0decSYunsheng Lin if [[ $valid -ne 1 ]]; then 132*7fef0decSYunsheng Lin echo "Error: key is not correct: ${key}" 133*7fef0decSYunsheng Lin exit $exitcode 134*7fef0decSYunsheng Lin fi 135*7fef0decSYunsheng Lin done 136*7fef0decSYunsheng Lin} 137*7fef0decSYunsheng Lin 138*7fef0decSYunsheng Linfunction run_manual_check() 139*7fef0decSYunsheng Lin{ 140*7fef0decSYunsheng Lin # 141*7fef0decSYunsheng Lin # Validate passed parameters. If there is wrong one, 142*7fef0decSYunsheng Lin # the script exists and does not execute further. 143*7fef0decSYunsheng Lin # 144*7fef0decSYunsheng Lin validate_passed_args $@ 145*7fef0decSYunsheng Lin 146*7fef0decSYunsheng Lin echo "Run the test with following parameters: $@" 147*7fef0decSYunsheng Lin insmod $DRIVER $@ > /dev/null 2>&1 148*7fef0decSYunsheng Lin} 149*7fef0decSYunsheng Lin 150*7fef0decSYunsheng Linfunction run_test() 151*7fef0decSYunsheng Lin{ 152*7fef0decSYunsheng Lin if [ $# -eq 0 ]; then 153*7fef0decSYunsheng Lin usage 154*7fef0decSYunsheng Lin else 155*7fef0decSYunsheng Lin if [[ "$1" = "smoke" ]]; then 156*7fef0decSYunsheng Lin run_smoke_check 157*7fef0decSYunsheng Lin elif [[ "$1" = "nonaligned" ]]; then 158*7fef0decSYunsheng Lin run_nonaligned_check 159*7fef0decSYunsheng Lin elif [[ "$1" = "aligned" ]]; then 160*7fef0decSYunsheng Lin run_aligned_check 161*7fef0decSYunsheng Lin else 162*7fef0decSYunsheng Lin run_manual_check $@ 163*7fef0decSYunsheng Lin fi 164*7fef0decSYunsheng Lin fi 165*7fef0decSYunsheng Lin 166*7fef0decSYunsheng Lin check_test_failed_prefix 167*7fef0decSYunsheng Lin 168*7fef0decSYunsheng Lin echo "Done." 169*7fef0decSYunsheng Lin echo "Check the kernel ring buffer to see the summary." 170*7fef0decSYunsheng Lin} 171*7fef0decSYunsheng Lin 172*7fef0decSYunsheng Lincheck_test_requirements 173*7fef0decSYunsheng Linrun_test $@ 174*7fef0decSYunsheng Lin 175*7fef0decSYunsheng Linexit 0 176