netifd: disable receive packet steering for DSA slave devices
[oweals/openwrt.git] / package / network / config / netifd / files / etc / hotplug.d / net / 20-smp-packet-steering
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/tx-*; do
56                 set_hex_val "$q/xps_cpus" "$PROC_MASK"
57         done
58
59         # ignore dsa slave ports for RPS
60         subsys="$(readlink "${dev}/device/subsystem")"
61         subsys="$(basename "$subsys")"
62         [ "$subsys" = "mdio_bus" ] && continue
63
64         for q in ${dev}/queues/rx-*; do
65                 set_hex_val "$q/rps_cpus" "$PROC_MASK"
66         done
67 done