| #!/bin/bash | |
| # SPDX-License-Identifier: GPL-2.0 | |
| # | |
| # Modules specific tests cases | |
| # protect against multiple inclusion | |
| if [ $FILE_MODULE ]; then | |
| return 0 | |
| else | |
| FILE_MODULE=DONE | |
| fi | |
| source cpu.sh | |
| source cpufreq.sh | |
| source governor.sh | |
| # Check basic insmod/rmmod | |
| # $1: module | |
| test_basic_insmod_rmmod() | |
| { | |
| printf "** Test: Running ${FUNCNAME[0]} **\n\n" | |
| printf "Inserting $1 module\n" | |
| # insert module | |
| insmod $1 | |
| if [ $? != 0 ]; then | |
| ktap_exit_fail_msg "Insmod $1 failed\n" | |
| fi | |
| printf "Removing $1 module\n" | |
| # remove module | |
| rmmod $1 | |
| if [ $? != 0 ]; then | |
| ktap_exit_fail_msg "rmmod $1 failed\n" | |
| fi | |
| printf "\n" | |
| } | |
| # Insert cpufreq driver module and perform basic tests | |
| # $1: cpufreq-driver module to insert | |
| # $2: If we want to play with CPUs (1) or not (0) | |
| module_driver_test_single() | |
| { | |
| printf "** Test: Running ${FUNCNAME[0]} for driver $1 and cpus_hotplug=$2 **\n\n" | |
| if [ $2 -eq 1 ]; then | |
| # offline all non-boot CPUs | |
| for_each_non_boot_cpu offline_cpu | |
| printf "\n" | |
| fi | |
| # insert module | |
| printf "Inserting $1 module\n\n" | |
| insmod $1 | |
| if [ $? != 0 ]; then | |
| printf "Insmod $1 failed\n" | |
| return; | |
| fi | |
| if [ $2 -eq 1 ]; then | |
| # online all non-boot CPUs | |
| for_each_non_boot_cpu online_cpu | |
| printf "\n" | |
| fi | |
| # run basic tests | |
| cpufreq_basic_tests | |
| # remove module | |
| printf "Removing $1 module\n\n" | |
| rmmod $1 | |
| if [ $? != 0 ]; then | |
| printf "rmmod $1 failed\n" | |
| return; | |
| fi | |
| # There shouldn't be any cpufreq directories now. | |
| for_each_cpu cpu_should_not_have_cpufreq_directory | |
| printf "\n" | |
| } | |
| # $1: cpufreq-driver module to insert | |
| module_driver_test() | |
| { | |
| printf "** Test: Running ${FUNCNAME[0]} **\n\n" | |
| # check if module is present or not | |
| ls $1 > /dev/null | |
| if [ $? != 0 ]; then | |
| printf "$1: not present in `pwd` folder\n" | |
| return; | |
| fi | |
| # test basic module tests | |
| test_basic_insmod_rmmod $1 | |
| # Do simple module test | |
| module_driver_test_single $1 0 | |
| # Remove CPUs before inserting module and then bring them back | |
| module_driver_test_single $1 1 | |
| printf "\n" | |
| } | |
| # find governor name based on governor module name | |
| # $1: governor module name | |
| find_gov_name() | |
| { | |
| if [ $1 = "cpufreq_ondemand.ko" ]; then | |
| printf "ondemand" | |
| elif [ $1 = "cpufreq_conservative.ko" ]; then | |
| printf "conservative" | |
| elif [ $1 = "cpufreq_userspace.ko" ]; then | |
| printf "userspace" | |
| elif [ $1 = "cpufreq_performance.ko" ]; then | |
| printf "performance" | |
| elif [ $1 = "cpufreq_powersave.ko" ]; then | |
| printf "powersave" | |
| elif [ $1 = "cpufreq_schedutil.ko" ]; then | |
| printf "schedutil" | |
| fi | |
| } | |
| # $1: governor string, $2: governor module, $3: policy | |
| # example: module_governor_test_single "ondemand" "cpufreq_ondemand.ko" 2 | |
| module_governor_test_single() | |
| { | |
| printf "** Test: Running ${FUNCNAME[0]} for $3 **\n\n" | |
| backup_governor $3 | |
| # switch to new governor | |
| printf "Switch from $CUR_GOV to $1\n" | |
| switch_show_governor $3 $1 | |
| # try removing module, it should fail as governor is used | |
| printf "Removing $2 module\n\n" | |
| rmmod $2 | |
| if [ $? = 0 ]; then | |
| printf "WARN: rmmod $2 succeeded even if governor is used\n" | |
| insmod $2 | |
| else | |
| printf "Pass: unable to remove $2 while it is being used\n\n" | |
| fi | |
| # switch back to old governor | |
| printf "Switchback to $CUR_GOV from $1\n" | |
| restore_governor $3 | |
| printf "\n" | |
| } | |
| # Insert cpufreq governor module and perform basic tests | |
| # $1: cpufreq-governor module to insert | |
| module_governor_test() | |
| { | |
| printf "** Test: Running ${FUNCNAME[0]} **\n\n" | |
| # check if module is present or not | |
| ls $1 > /dev/null | |
| if [ $? != 0 ]; then | |
| printf "$1: not present in `pwd` folder\n" | |
| return; | |
| fi | |
| # test basic module tests | |
| test_basic_insmod_rmmod $1 | |
| # insert module | |
| printf "Inserting $1 module\n\n" | |
| insmod $1 | |
| if [ $? != 0 ]; then | |
| printf "Insmod $1 failed\n" | |
| return; | |
| fi | |
| # switch to new governor for each cpu | |
| for_each_policy module_governor_test_single $(find_gov_name $1) $1 | |
| # remove module | |
| printf "Removing $1 module\n\n" | |
| rmmod $1 | |
| if [ $? != 0 ]; then | |
| printf "rmmod $1 failed\n" | |
| return; | |
| fi | |
| printf "\n" | |
| } | |
| # test modules: driver and governor | |
| # $1: driver module, $2: governor module | |
| module_test() | |
| { | |
| printf "** Test: Running ${FUNCNAME[0]} **\n\n" | |
| # check if modules are present or not | |
| ls $1 $2 > /dev/null | |
| if [ $? != 0 ]; then | |
| printf "$1 or $2: is not present in `pwd` folder\n" | |
| return; | |
| fi | |
| # TEST1: Insert gov after driver | |
| # insert driver module | |
| printf "Inserting $1 module\n\n" | |
| insmod $1 | |
| if [ $? != 0 ]; then | |
| printf "Insmod $1 failed\n" | |
| return; | |
| fi | |
| # run governor tests | |
| module_governor_test $2 | |
| # remove driver module | |
| printf "Removing $1 module\n\n" | |
| rmmod $1 | |
| if [ $? != 0 ]; then | |
| printf "rmmod $1 failed\n" | |
| return; | |
| fi | |
| # TEST2: Insert driver after governor | |
| # insert governor module | |
| printf "Inserting $2 module\n\n" | |
| insmod $2 | |
| if [ $? != 0 ]; then | |
| printf "Insmod $2 failed\n" | |
| return; | |
| fi | |
| # run governor tests | |
| module_driver_test $1 | |
| # remove driver module | |
| printf "Removing $2 module\n\n" | |
| rmmod $2 | |
| if [ $? != 0 ]; then | |
| printf "rmmod $2 failed\n" | |
| return; | |
| fi | |
| } |