Remove RPS/XPS support from netifd core, move the logic to a hotplug script that uses a different policy which provides better performance and more fairness across flows Signed-off-by: Felix Fietkau <nbd@nbd.name>master
parent
810659a22c
commit
916e33fa1e
@ -0,0 +1,67 @@ |
|||||||
|
#!/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 |
Loading…
Reference in new issue