diff --git a/configs/rpi-4-files/etc/init.d/irq-eth-pin b/configs/rpi-4-files/etc/init.d/irq-eth-pin new file mode 100755 index 0000000..8bbb143 --- /dev/null +++ b/configs/rpi-4-files/etc/init.d/irq-eth-pin @@ -0,0 +1,36 @@ +#!/bin/sh /etc/rc.common + +uci_banirq=irqbalance.irqbalance.banirq +cpu_irq_eth=2 + +# Move eth0 IRQs to CPU1 (numbered 1-4 when writing) +# And ban irqbalance from messing with it +# The USB3 Ethernet IRQs cannot be moved and must stay on CPU0 +irqs_eth0=$(sed -rn "s/^\s*([0-9]+):.*eth0$/\1/p" /proc/interrupts) + +for n in ${irqs_eth0}; do + echo ${cpu_irq_eth} > /proc/irq/${n}/smp_affinity + if ! uci get ${uci_banirq} | grep -q ${n}; then + uci add_list ${uci_banirq}=${n} + fi +done +uci commit + +logger -t "irq_eth_pin" "Moved eth0 IRQs ${irqs_eth0} to cpu${cpu_irq_eth}" + +softirqs_move() { + # Move softirqs for network traffic to CPU2 and CPU3 + # Maybe not a brilliant idea because the softirqs are probably better off + # being processed on the CPU that got the original IRQ + # (and that is exactly the default when the value is 0) + # NOTE: it appears that the openwrt 20.02-rc1 kernel has a bug that + # returns "No such file or directory" for /sys/class/net/eth1/queues/xps_cpus + for ifname in eth0; do # eth1 + for f in $(find /sys/class/net/${ifname}/queues -name xps_cpus -o -name rps_cpus); do + if [ -f ${f} ]; then + echo "${f} = $(cat ${f})" + echo c >${f} + fi + done + done +} diff --git a/configs/rpi-4-files/etc/rc.d/S85irq-eth-pin b/configs/rpi-4-files/etc/rc.d/S85irq-eth-pin new file mode 120000 index 0000000..d5fb68a --- /dev/null +++ b/configs/rpi-4-files/etc/rc.d/S85irq-eth-pin @@ -0,0 +1 @@ +../init.d/irq-eth-pin \ No newline at end of file