rockchip: distribute net interrupts
authorDavid Bauer <mail@david-bauer.net>
Mon, 27 Jul 2020 21:13:02 +0000 (23:13 +0200)
committerDavid Bauer <mail@david-bauer.net>
Tue, 28 Jul 2020 13:52:44 +0000 (15:52 +0200)
This adds a hotplug script for distributing interrupts of eth0 and eth1
across different cores. Otherwise the forwarding performance between
eth0 and eth1 is severely affected.

The existing SMP distribution mechanic in OpenWrt can't be used here, as
the actual device IRQ has to be moved to dedicated cores. In case of
eth1, this is in fact the USB3 controller.

Signed-off-by: David Bauer <mail@david-bauer.net>
target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity [new file with mode: 0644]

diff --git a/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity b/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity
new file mode 100644 (file)
index 0000000..ab3f954
--- /dev/null
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+[ "$ACTION" = add ] || exit
+
+get_device_irq() {
+       local device="$1"
+
+       local line=$(grep -m 1 "${device}\$" /proc/interrupts)
+       echo $(echo ${line} | sed 's/:.*//')
+}
+
+set_interface_core() {
+       local core_mask="$1"
+       local interface="$2"
+       local device="$3"
+
+       [ -z "${device}" ] && device="$interface"
+
+       local irq=$(get_device_irq "$device")
+
+       echo "${core_mask}" > /proc/irq/${irq}/smp_affinity
+}
+
+case "$(board_name)" in
+friendlyarm,nanopi-r2s)
+       set_interface_core 2 "eth0"
+       set_interface_core 4 "eth1" "xhci-hcd:usb3"
+       ;;
+esac
+