OpenWrt – Rev 1

Subversion Repositories:
Rev:
#!/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