aboutsummaryrefslogtreecommitdiffstats
path: root/package/network/config/netifd/files
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@nbd.name>2018-02-26 12:30:28 +0100
committerFelix Fietkau <nbd@nbd.name>2018-02-28 12:46:02 +0100
commit916e33fa1e14b97daf8c9bf07a1b36f9767db679 (patch)
tree462528e7fc08eb16a2fd942151b27fc89f35fe35 /package/network/config/netifd/files
parent810659a22c11ea0d2d94f3e09ddf7eb2d2bb1f1e (diff)
downloadupstream-916e33fa1e14b97daf8c9bf07a1b36f9767db679.tar.gz
upstream-916e33fa1e14b97daf8c9bf07a1b36f9767db679.tar.bz2
upstream-916e33fa1e14b97daf8c9bf07a1b36f9767db679.zip
netifd: update to the latest version, rewrite RPS/XPS handling
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>
Diffstat (limited to 'package/network/config/netifd/files')
-rw-r--r--package/network/config/netifd/files/etc/hotplug.d/net/20-smp-tune67
1 files changed, 67 insertions, 0 deletions
diff --git a/package/network/config/netifd/files/etc/hotplug.d/net/20-smp-tune b/package/network/config/netifd/files/etc/hotplug.d/net/20-smp-tune
new file mode 100644
index 0000000000..ab9a90418e
--- /dev/null
+++ b/package/network/config/netifd/files/etc/hotplug.d/net/20-smp-tune
@@ -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