#!/bin/bash # protect against multiple inclusion if [ $FILE_CPUFREQ ]; then return 0 else FILE_CPUFREQ=DONE fi source cpu.sh # GLOBALS CPU_PATH="/sys/devices/system/cpu" GLOBAL_CPUFREQ="/sys/devices/system/cpu/cpufreq" # GENERIC HELPERS # $1: cpu cpu_should_have_cpufreq_directory() { if [ ! -d /sys/devices/system/cpu/$1/cpufreq ]; then echo "Warning: No cpufreq directory present for $1" fi } cpu_should_not_have_cpufreq_directory() { if [ -d /sys/devices/system/cpu/$1/cpufreq ]; then echo "Warning: cpufreq directory present for $1" fi } # READ CPUFREQ FILES # $1: directory path __read_cpufreq_files() { local filepath=$1 # Exit if cpu isn't mananged by cpufreq core if [ ! -d $filepath ]; then return; fi local files=`ls $filepath` echo "Printing directory: $filepath" echo "" for file in $files; do if [ -f $filepath/$file ]; then echo "$file:" cat $filepath/$file else echo "" __read_cpufreq_files "$filepath/$file" fi done echo "" } # $1: directory path # $2: cpu read_cpufreq_files_for_cpu() { local filepath=$CPU_PATH/$2/$1 __read_cpufreq_files $filepath } read_all_cpufreq_files() { echo "** Test: Running ${FUNCNAME[0]} **" echo "" __read_cpufreq_files $GLOBAL_CPUFREQ echo "" for_each_cpu read_cpufreq_files_for_cpu "cpufreq" echo "------------------------------------------------" echo "" } # UPDATE CPUFREQ FILES # $1: directory path __update_cpufreq_files() { local filepath=$1 # Exit if cpu isn't mananged by cpufreq core if [ ! -d $filepath ]; then return; fi local files=`ls $filepath` echo "Updating directory: $filepath" echo "" for file in $files; do if [ -f $filepath/$file ]; then # file is writable ? local wfile=$(ls -l $filepath/$file | awk '$1 ~ /^.*w.*/ { print $NF; }') if [ ! -z $wfile ]; then local val=$(cat $filepath/$file) echo "Writing $val to: $file" echo $val > $filepath/$file fi else echo "" __update_cpufreq_files "$filepath/$file" fi done echo "" } # $1: directory path # $2: cpu update_cpufreq_files_for_cpu() { local filepath=$CPU_PATH/$2/$1 __update_cpufreq_files $filepath } # Update all writable files with their existing values update_all_cpufreq_files() { echo "** Test: Running ${FUNCNAME[0]} **" echo "" __update_cpufreq_files $GLOBAL_CPUFREQ echo "" for_each_cpu update_cpufreq_files_for_cpu "cpufreq" echo "------------------------------------------------" echo "" } # CHANGE CPU FREQUENCIES # $1: cpu # $2: frequency set_cpu_frequency() { echo $2 > $CPU_PATH/$1/cpufreq/scaling_setspeed } # $1: cpu test_all_cpu_frequencies() { local filepath="$CPU_PATH/$1/cpufreq" # Exit if cpu isn't mananged by cpufreq core if [ ! -d $filepath ]; then return; fi local found=$(switch_governor $1 "userspace") if [ $found = 1 ]; then echo "${FUNCNAME[0]}: userspace governor not available for: $1" return; else echo "Switching governor for $1 to userspace" fi local freqs=$(cat $filepath/scaling_available_frequencies) echo "Available frequencies for $1: $freqs" # Set all frequencies one-by-one for freq in $freqs; do set_cpu_frequency $1 $freq done } # $1: loop count shuffle_frequency_for_all_cpus() { echo "** Test: Running ${FUNCNAME[0]} for $1 loops **" echo "" for i in `seq 1 $1`; do for_each_cpu test_all_cpu_frequencies done echo "------------------------------------------------" echo "" } # Calls the routine $1 passed to it and dumps all messages in: # - script output: $2.txt # - cpufreq messages: $2.cpufreq.txt # - complete dmesg: $2.full.txt call_routine() { # call routine $1 > $2.txt dmesg | grep cpufreq > $2.cpufreq.txt # We may need the full logs as well dmesg --read-clear > $2.full.txt } # Basic cpufreq tests cpufreq_basic_tests() { echo "*** RUNNING CPUFREQ SANITY TESTS ***" echo "====================================" echo "" count=$(count_cpufreq_managed_cpus) if [ $count = 0 ]; then echo "No cpu is managed by cpufreq core, exiting" exit; else echo "CPUFreq manages: $count CPUs" echo "" fi # Detect & print which CPUs aren't managed by cpufreq print_unmanaged_cpus # read/update all cpufreq files read_all_cpufreq_files update_all_cpufreq_files # hotplug cpus hotplug_1_by_1 5 hotplug_together 5 # Test all governors shuffle_governors_for_all_cpus 1 # Test all frequencies shuffle_frequency_for_all_cpus 2 }