#!/bin/sh [ "$ACTION" = add ] || exit get_device_irq() { local device="$1" local line local seconds="0" # wait up to 10 seconds for the irq/device to appear while [ "${seconds}" -le 10 ]; do line=$(grep -m 1 "${device}\$" /proc/interrupts) && break seconds="$(( seconds + 2 ))" sleep 2 done 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-r4s) set_interface_core 10 "eth0" set_interface_core 20 "eth1" ethtool -K eth1 tso on sg on tx on ;; friendlyarm,nanopi-r5c) set_interface_core 2 "eth0-0" set_interface_core 2 "eth0-16" set_interface_core 2 "eth0-18" echo d > /sys/class/net/eth0/queues/rx-0/rps_cpus set_interface_core 4 "eth1-0" set_interface_core 4 "eth1-16" set_interface_core 4 "eth1-18" echo b > /sys/class/net/eth1/queues/rx-0/rps_cpus ethtool -K eth0 tso on sg on tx on ethtool -K eth1 tso on sg on tx on ;; friendlyarm,nanopi-r5s) # eth0 - cpu 1 set_interface_core 2 "eth0" echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus # eth1 - cpu 2 set_interface_core 4 "eth1-0" set_interface_core 4 "eth1-1" set_interface_core 4 "eth1-16" set_interface_core 4 "eth1-18" set_interface_core 4 "eth1-21" echo b > /sys/class/net/eth1/queues/rx-0/rps_cpus ethtool -K eth1 tso on sg on tx on # eth2 - cpu 3 set_interface_core 8 "eth2-0" set_interface_core 8 "eth2-1" set_interface_core 8 "eth2-16" set_interface_core 8 "eth2-18" set_interface_core 8 "eth2-21" echo 7 > /sys/class/net/eth2/queues/rx-0/rps_cpus ethtool -K eth2 tso on sg on tx on ;; esac