Home | History | Annotate | Download | only in scripts
      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