print_flags() { flags[1]="SD_LOAD_BALANCE: Do load balancing on this domain" flags[2]="SD_BALANCE_NEWIDLE: Balance when about to become idle" flags[4]="SD_BALANCE_EXEC: Balance on exec" flags[8]="SD_BALANCE_FORK: Balance on fork, clone" flags[16]="SD_WAKE_IDLE: Wake to idle CPU on task wakeup" flags[32]="SD_WAKE_AFFINE: Wake task to waking CPU" flags[64]="SD_WAKE_BALANCE: Perform balancing at task wakeup" flags[128]="SD_SHARE_CPUPOWER: Domain members share cpu power" flags[256]="SD_POWERSAVINGS_BALANCE: Balance for power savings" flags[512]="SD_SHARE_PKG_RESOURCES: Domain members share cpu pkg resources" flags[1024]="SD_SERIALIZE: Only a single load balancing instance" flags[2048]="SD_WAKE_IDLE_FAR: Gain latency sacrificing cache hit" DEC=$1 echo "SD flag: $DEC" for ((mask=1;mask<2048;mask*=2)); do if [ "$[$mask & $DEC]" != "0" ]; then printf "+%4d: %s\n" $mask "${flags[$mask]}" else if [ $mask -le 64 ]; then printf "%c%4d: %s\n" "-" $mask "${flags[$mask]}" fi fi done } [ $# -lt "1" ] && { echo 'usage: tune-sched-domains ' VAL=$(cat /proc/sys/kernel/sched_domain/cpu0/domain0/flags) echo "current val on cpu0/domain0:" print_flags $VAL exit -1; } DOM0=$1 DOM1=${2:-$DOM0} DOM2=${3:-$DOM1} DOM3=${4:-$DOM2} for CPU in /proc/sys/kernel/sched_domain/*; do for N in $CPU/*/flags; do VAL=`cat $N` case $N in "$CPU/domain0/flags") NEW_VAL=$DOM0 ;; "$CPU/domain1/flags") NEW_VAL=$DOM1 ;; "$CPU/domain2/flags") NEW_VAL=$DOM2 ;; "$CPU/domain3/flags") NEW_VAL=$DOM3 ;; *) echo "error!" ;; esac NEW_VAL=$1 echo $NEW_VAL > $N [ "$CPU" = "/proc/sys/kernel/sched_domain/cpu0" ] && { echo "changed $N: $VAL => $NEW_VAL" print_flags $NEW_VAL } done done