From: Rafał Miłecki Date: Fri, 10 Jun 2022 08:51:23 +0000 (+0200) Subject: bcm53xx: enable & setup packet steering X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=fcbd39689ebfef20c62fe3882d51f3af765e8028;p=openwrt%2Fstaging%2Flinusw.git bcm53xx: enable & setup packet steering Packet steering can improve NAT masquarade performance on Northstar by 40-50%. It makes reaching 940-942 Mb/s possible on BCM4708 (and obviously BCM47094 too). Add scripts setting up the most optimal Northstar setup. Below are testing results for running iperf TCP traffic from LAN to WAN. They were used to pick up golden values. ┌──────────┬──────────┬────────────────────┬────────────────────┐ │ eth0 │ br-lan │ flow_offloading=0 │ flow_offloading=1 │ │ │ ├─────────┬──────────┼─────────┬──────────┤ │ rps_cpus │ rps_cpus │ BCM4708 │ BCM47094 │ BCM4708 │ BCM47094 │ ├──────────┼──────────┼─────────┼──────────┼─────────┼──────────┤ │ 0 │ 0 │ 387 │ 671 │ 707 │ 941 │ │ 0 │ 1 │ 343 │ 576 │ 705 │ 941 │ │ 0 │ 2 │ ✓ 574 │ ✓ 941 │ 704 │ 940 │ │ 1 │ 0 │ 320 │ 549 │ 561 │ 941 │ │ 1 │ 1 │ 327 │ 551 │ 553 │ 941 │ │ 1 │ 2 │ 523 │ ✓ 940 │ 559 │ 940 │ │ 2 │ 0 │ 383 │ 652 │ ✓ 940 │ 941 │ │ 2 │ 1 │ 448 │ 754 │ ✓ 942 │ 941 │ │ 2 │ 2 │ 404 │ 655 │ ✓ 941 │ 941 │ └──────────┴──────────┴─────────┴──────────┴─────────┴──────────┘ Above tests were performed with all eth0 interrupts handled by CPU0. Setting "echo 2 > /proc/irq/38/smp_affinity" was tested on BCM4708 but it didn't increased speeds (just required different steering): ┌──────────┬──────────┬───────────┐ │ eth0 │ br-lan │ flow_offl │ │ rx-0 │ rx-0 │ oading=0 │ │ rps_cpus │ rps_cpus │ BCM4708 │ ├──────────┼──────────┼───────────┤ │ 0 │ 0 │ 384 │ │ 0 │ 1 │ ✓ 574 │ │ 0 │ 2 │ 348 │ │ 1 │ 0 │ 383 │ │ 1 │ 1 │ 412 │ │ 1 │ 2 │ 448 │ │ 2 │ 0 │ 321 │ │ 2 │ 1 │ 520 │ │ 2 │ 2 │ 327 │ └──────────┴──────────┴───────────┘ Signed-off-by: Rafał Miłecki --- diff --git a/target/linux/bcm53xx/base-files/etc/init.d/fastnetwork b/target/linux/bcm53xx/base-files/etc/init.d/fastnetwork new file mode 100755 index 0000000000..1999d13707 --- /dev/null +++ b/target/linux/bcm53xx/base-files/etc/init.d/fastnetwork @@ -0,0 +1,44 @@ +#!/bin/sh /etc/rc.common + +START=25 +USE_PROCD=1 + +start_service() { + reload_service +} + +service_triggers() { + procd_add_reload_trigger "network" + procd_add_reload_trigger "firewall" + procd_add_reload_interface_trigger "lan" +} + +reload_service() { + local packet_steering="$(uci -q get network.@globals[0].packet_steering)" + local num_cpus="$(grep -c "^processor.*:" /proc/cpuinfo)" + local flow_offloading="$(uci -q get firewall.@defaults[0].flow_offloading)" + local flow_offloading_hw="$(uci -q get firewall.@defaults[0].flow_offloading_hw)" + + # Any steering on 1 CPU (BCM47081) worsens network performance + [ "$num_cpus" != 2 ] && return + + [ "$packet_steering" != 1 ] && { + echo 0 > /sys/class/net/br-lan/queues/rx-0/rps_cpus + echo 0 > /sys/class/net/eth0/queues/rx-0/rps_cpus + return + } + + if [ ${flow_offloading_hw:-0} -gt 0 ]; then + # HW offloading + echo 0 > /sys/class/net/br-lan/queues/rx-0/rps_cpus + echo 0 > /sys/class/net/eth0/queues/rx-0/rps_cpus + elif [ ${flow_offloading:-0} -gt 0 ]; then + # SW offloading + # br-lan setup doesn't seem to matter for offloading case + echo 2 > /sys/class/net/eth0/queues/rx-0/rps_cpus + else + # Default + echo 2 > /sys/class/net/br-lan/queues/rx-0/rps_cpus + echo 0 > /sys/class/net/eth0/queues/rx-0/rps_cpus + fi +} diff --git a/target/linux/bcm53xx/base-files/etc/uci-defaults/05_packet_steering b/target/linux/bcm53xx/base-files/etc/uci-defaults/05_packet_steering new file mode 100644 index 0000000000..98c9497815 --- /dev/null +++ b/target/linux/bcm53xx/base-files/etc/uci-defaults/05_packet_steering @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: GPL-2.0-only + +uci set network.@globals[0].packet_steering="1"