netifd: change RPS/XPS handling to all CPUs and disable by default
[openwrt/staging/rmilecki.git] / package / network / config / netifd / files / etc / hotplug.d / net / 20-smp-tune
1 #!/bin/sh
2 [ "$ACTION" = add ] || exit
3
4 NPROCS="$(grep -c "^processor.*:" /proc/cpuinfo)"
5 [ "$NPROCS" -gt 1 ] || exit
6
7 PROC_MASK="$(( (1 << $NPROCS) - 1 ))"
8
9 find_irq_cpu() {
10 local dev="$1"
11 local match="$(grep -m 1 "$dev\$" /proc/interrupts)"
12 local cpu=0
13
14 [ -n "$match" ] && {
15 set -- $match
16 shift
17 for cur in `seq 1 $NPROCS`; do
18 [ "$1" -gt 0 ] && {
19 cpu=$(($cur - 1))
20 break
21 }
22 shift
23 done
24 }
25
26 echo "$cpu"
27 }
28
29 set_hex_val() {
30 local file="$1"
31 local val="$2"
32 val="$(printf %x "$val")"
33 [ -n "$DEBUG" ] && echo "$file = $val"
34 echo "$val" > "$file"
35 }
36
37 packet_steering="$(uci get "network.@globals[0].packet_steering")"
38 [ "$packet_steering" != 1 ] && exit 0
39
40 exec 512>/var/lock/smp_tune.lock
41 flock 512 || exit 1
42
43 for dev in /sys/class/net/*; do
44 [ -d "$dev" ] || continue
45
46 # ignore virtual interfaces
47 [ -n "$(ls "${dev}/" | grep '^lower_')" ] && continue
48 [ -d "${dev}/device" ] || continue
49
50 device="$(readlink "${dev}/device")"
51 device="$(basename "$device")"
52 irq_cpu="$(find_irq_cpu "$device")"
53 irq_cpu_mask="$((1 << $irq_cpu))"
54
55 for q in ${dev}/queues/rx-*; do
56 set_hex_val "$q/rps_cpus" "$PROC_MASK"
57 done
58
59 for q in ${dev}/queues/tx-*; do
60 set_hex_val "$q/xps_cpus" "$PROC_MASK"
61 done
62 done