#!/bin/sh [ "$ACTION" = add ] || exit NPROCS="$(grep -c "^processor.*:" /proc/cpuinfo)" [ "$NPROCS" -gt 1 ] || exit PROC_MASK="$(( (1 << $NPROCS) - 1 ))" find_irq_cpu() { local dev="$1" local match="$(grep -m 1 "$dev\$" /proc/interrupts)" local cpu=0 [ -n "$match" ] && { set -- $match shift for cur in `seq 1 $NPROCS`; do [ "$1" -gt 0 ] && { cpu=$(($cur - 1)) break } shift done } echo "$cpu" } set_hex_val() { local file="$1" local val="$2" val="$(printf %x "$val")" [ -n "$DEBUG" ] && echo "$file = $val" echo "$val" > "$file" } default_ps="$(uci get "network.@globals[0].default_ps")" [ -n "$default_ps" -a "$default_ps" != 1 ] && exit 0 exec 512>/var/lock/smp_tune.lock flock 512 || exit 1 for dev in /sys/class/net/*; do [ -d "$dev" ] || continue # ignore virtual interfaces [ -n "$(ls "${dev}/" | grep '^lower_')" ] && continue [ -d "${dev}/device" ] || continue device="$(readlink "${dev}/device")" device="$(basename "$device")" irq_cpu="$(find_irq_cpu "$device")" irq_cpu_mask="$((1 << $irq_cpu))" for q in ${dev}/queues/rx-*; do set_hex_val "$q/rps_cpus" "$(($PROC_MASK & ~$irq_cpu_mask))" done ntxq="$(ls -d ${dev}/queues/tx-* | wc -l)" idx=$(($irq_cpu + 1)) for q in ${dev}/queues/tx-*; do set_hex_val "$q/xps_cpus" "$((1 << $idx))" let "idx = idx + 1" [ "$idx" -ge "$NPROCS" ] && idx=0 done done