From 954975fbc48c2273051ba2b83e85e2e462130725 Mon Sep 17 00:00:00 2001
From: John Crispin <john@phrozen.org>
Date: Tue, 14 Dec 2021 07:20:25 +0100
Subject: [PATCH] ipq40xx: add packet_steering script from 19.07

Signed-off-by: John Crispin <john@phrozen.org>
---
 .../base-files/etc/hotplug.d/net/20-smp-tune  | 67 +++++++++++++++++++
 1 file changed, 67 insertions(+)
 create mode 100644 target/linux/ipq40xx/base-files/etc/hotplug.d/net/20-smp-tune

diff --git a/target/linux/ipq40xx/base-files/etc/hotplug.d/net/20-smp-tune b/target/linux/ipq40xx/base-files/etc/hotplug.d/net/20-smp-tune
new file mode 100644
index 0000000000..ab9a90418e
--- /dev/null
+++ b/target/linux/ipq40xx/base-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
-- 
2.25.1

