1 #!__DEVLIB_SHELL__ 2 3 CMD=$1 4 shift 5 6 BUSYBOX=${BUSYBOX:-__DEVLIB_BUSYBOX__} 7 FIND=${FIND:-$BUSYBOX find} 8 GREP=${GREP:-$BUSYBOX grep} 9 SED=${SED:-$BUSYBOX sed} 10 CAT=${CAT:-$BUSYBOX cat} 11 AWK=${AWK:-$BUSYBOX awk} 12 PS=${PS:-$BUSYBOX ps} 13 14 ################################################################################ 15 # CPUFrequency Utility Functions 16 ################################################################################ 17 18 cpufreq_set_all_frequencies() { 19 FREQ=$1 20 for CPU in /sys/devices/system/cpu/cpu[0-9]*; do 21 echo $FREQ > $CPU/cpufreq/scaling_cur_freq 22 done 23 } 24 25 cpufreq_get_all_frequencies() { 26 $GREP '' /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq | \ 27 $SED -e 's|/sys/devices/system/cpu/cpu||' -e 's|/cpufreq/scaling_cur_freq:| |' 28 } 29 30 cpufreq_set_all_governors() { 31 GOV=$1 32 for CPU in /sys/devices/system/cpu/cpu[0-9]*; do 33 echo $GOV > $CPU/cpufreq/scaling_governor 34 done 35 } 36 37 cpufreq_get_all_governors() { 38 $GREP '' /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor | \ 39 $SED -e 's|/sys/devices/system/cpu/cpu||' -e 's|/cpufreq/scaling_governor:| |' 40 } 41 42 cpufreq_trace_all_frequencies() { 43 FREQS=$($CAT /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq) 44 CPU=0; for F in $FREQS; do 45 echo "cpu_frequency_devlib: state=$F cpu_id=$CPU" > /sys/kernel/debug/tracing/trace_marker 46 CPU=$((CPU + 1)) 47 done 48 } 49 50 ################################################################################ 51 # CPUIdle Utility Functions 52 ################################################################################ 53 54 cpuidle_wake_all_cpus() { 55 CPU_PATHS=/sys/devices/system/cpu/cpu[0-9]* 56 MASK=0x1; for F in $CPU_PATHS; do 57 $BUSYBOX taskset $MASK true & 58 MASK=$($BUSYBOX printf '0x%x' $((MASK * 2))) 59 done 60 } 61 62 ################################################################################ 63 # FTrace Utility Functions 64 ################################################################################ 65 66 ftrace_get_function_stats() { 67 for CPU in $(ls /sys/kernel/debug/tracing/trace_stat | sed 's/function//'); do 68 REPLACE_STRING="s/ Function/\n Function (CPU$CPU)/" 69 $CAT /sys/kernel/debug/tracing/trace_stat/function$CPU \ 70 | sed "$REPLACE_STRING" 71 done 72 } 73 74 75 ################################################################################ 76 # CGroups Utility Functions 77 ################################################################################ 78 79 cgroups_get_attributes() { 80 test $# -eq 2 || exit -1 81 CGROUP="$1" 82 CONTROLLER="$2" 83 # Check if controller is mounted with "noprefix" option, which is quite 84 # common on Android for backward compatibility 85 ls $CGROUP/$CONTROLLER\.* 2>&1 >/dev/null 86 if [ $? -eq 0 ]; then 87 # no "noprefix" option, attributes format is: 88 # mnt_point/controller.attribute_name 89 $GREP '' $CGROUP/* | \ 90 $GREP "$CONTROLLER\." | \ 91 $SED -e "s|$CONTROLLER\.||" -e "s|$CGROUP/||" 92 else 93 # "noprefix" option, attribute format is: 94 # mnt_point/attribute_name 95 $GREP '' $(\ 96 $FIND $CGROUP -type f -maxdepth 1 | 97 $GREP -v -e ".*tasks" -e ".*cgroup\..*") | \ 98 $SED "s|$CGROUP/||" 99 fi 100 } 101 102 cgroups_run_into() { 103 104 # Control groups mount point 105 CGMOUNT=${CGMOUNT:-/sys/fs/cgroup} 106 # The control group we want to run into 107 CGP=${1} 108 shift 1 109 # The command to run 110 CMD="${@}" 111 112 # Execution under root CGgroup 113 if [ "x/" == "x$CGP" ]; then 114 115 $FIND $CGMOUNT -type d -maxdepth 0 | \ 116 while read CGPATH; do 117 # Move this shell into that control group 118 echo $$ > $CGPATH/cgroup.procs 119 echo "Moving task into root CGroup ($CGPATH)" 120 done 121 122 # Execution under specified CGroup 123 else 124 125 # Check if the required CGroup exists 126 $FIND $CGMOUNT -type d -mindepth 1 | \ 127 $GREP "$CGP" &>/dev/null 128 if [ $? -ne 0 ]; then 129 echo "ERROR: could not find any $CGP cgroup under $CGMOUNT" 130 exit 1 131 fi 132 133 $FIND $CGMOUNT -type d -mindepth 1 | \ 134 $GREP "$CGP" | \ 135 while read CGPATH; do 136 # Move this shell into that control group 137 echo $$ > $CGPATH/cgroup.procs 138 echo "Moving task into $CGPATH" 139 done 140 141 fi 142 143 # Execute the command 144 exec $CMD 145 146 } 147 148 cgroups_tasks_move() { 149 SRC_GRP=${1} 150 DST_GRP=${2} 151 shift 2 152 FILTERS=$* 153 154 $CAT $SRC_GRP/tasks | while read TID; do 155 echo $TID > $DST_GRP/cgroup.procs 156 done 157 158 [ "x$FILTERS" = "x" ] && exit 0 159 160 PIDS=`$PS -o comm,pid | $GREP $FILTERS | $AWK '{print $2}'` 161 PIDS=`echo $PIDS` 162 echo "PIDs to save: [$PIDS]" 163 for TID in $PIDS; do 164 COMM=`$CAT /proc/$TID/comm` 165 echo "$TID : $COMM" 166 echo $TID > $SRC_GRP/cgroup.procs || true 167 done 168 } 169 170 cgroups_tasks_in() { 171 GRP=${1} 172 for TID in $($CAT $GRP/tasks); do 173 COMM=`$CAT /proc/$TID/comm 2>/dev/null` 174 [ "$COMM" != "" ] && CMDL=`$CAT /proc/$TID/cmdline 2>/dev/null` 175 [ "$COMM" != "" ] && echo "$TID,$COMM,$CMDL" 176 done 177 exit 0 178 } 179 180 cgroup_trace_attach_task() { 181 DST_ROOT=${1} 182 DST_PATH=${2} 183 TASKS_FILE=${3} 184 185 cat $TASKS_FILE | while read PID; do 186 echo "cgroup_attach_task_devlib: dst_root=$DST_ROOT dst_path=$DST_PATH pid=$PID" > /sys/kernel/debug/tracing/trace_marker 187 done 188 } 189 190 ################################################################################ 191 # Main Function Dispatcher 192 ################################################################################ 193 194 case $CMD in 195 cpufreq_set_all_frequencies) 196 cpufreq_set_all_frequencies $* 197 ;; 198 cpufreq_get_all_frequencies) 199 cpufreq_get_all_frequencies 200 ;; 201 cpufreq_set_all_governors) 202 cpufreq_set_all_governors $* 203 ;; 204 cpufreq_get_all_governors) 205 cpufreq_get_all_governors 206 ;; 207 cpufreq_trace_all_frequencies) 208 cpufreq_trace_all_frequencies $* 209 ;; 210 cgroup_trace_attach_task) 211 cgroup_trace_attach_task $* 212 ;; 213 cpuidle_wake_all_cpus) 214 cpuidle_wake_all_cpus $* 215 ;; 216 cgroups_get_attributes) 217 cgroups_get_attributes $* 218 ;; 219 cgroups_run_into) 220 cgroups_run_into $* 221 ;; 222 cgroups_tasks_move) 223 cgroups_tasks_move $* 224 ;; 225 cgroups_tasks_in) 226 cgroups_tasks_in $* 227 ;; 228 ftrace_get_function_stats) 229 ftrace_get_function_stats 230 ;; 231 *) 232 echo "Command [$CMD] not supported" 233 exit -1 234 esac 235 236 # vim: tabstop=4 shiftwidth=4 237