From 44fa330a8254893ec81e5b3df16299f32a0f053f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Wed, 15 Jun 2022 10:41:37 +0200 Subject: [PATCH 1/6] kernel: use KCFLAGS for passing EXTRA_OPTIMIZATION flags MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This uses kernel's generic variable and doesn't require patching it with a custom Makefile change. It's expected *not* to change any behaviour. Signed-off-by: Rafał Miłecki (cherry picked from commit 1d42af720c6b6dcfcdd0b89bce386fca1607dcb3) Signed-off-by: Kevin Darbyshire-Bryant (cherry picked from commit 24e27bec9a6df1511a504cf04cd9578a23e74657) --- include/kernel.mk | 2 +- rules.mk | 1 - .../generic/pending-5.4/201-extra_optimization.patch | 12 +++--------- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/include/kernel.mk b/include/kernel.mk index e4074a48f4..5057d8bf6f 100644 --- a/include/kernel.mk +++ b/include/kernel.mk @@ -101,7 +101,7 @@ endif KERNEL_MAKE = $(MAKE) $(KERNEL_MAKEOPTS) KERNEL_MAKE_FLAGS = \ - KCFLAGS="$(call iremap,$(BUILD_DIR),$(notdir $(BUILD_DIR)))" \ + KCFLAGS="$(call iremap,$(BUILD_DIR),$(notdir $(BUILD_DIR))) $(filter-out -fno-plt,$(call qstrip,$(CONFIG_EXTRA_OPTIMIZATION)))" \ HOSTCFLAGS="$(HOST_CFLAGS) -Wall -Wmissing-prototypes -Wstrict-prototypes" \ CROSS_COMPILE="$(KERNEL_CROSS)" \ ARCH="$(LINUX_KARCH)" \ diff --git a/rules.mk b/rules.mk index f31d9bb113..da9bee2899 100644 --- a/rules.mk +++ b/rules.mk @@ -62,7 +62,6 @@ ARCH_PACKAGES:=$(call qstrip,$(CONFIG_TARGET_ARCH_PACKAGES)) BOARD:=$(call qstrip,$(CONFIG_TARGET_BOARD)) SUBTARGET:=$(call qstrip,$(CONFIG_TARGET_SUBTARGET)) TARGET_OPTIMIZATION:=$(call qstrip,$(CONFIG_TARGET_OPTIMIZATION)) -export EXTRA_OPTIMIZATION:=$(filter-out -fno-plt,$(call qstrip,$(CONFIG_EXTRA_OPTIMIZATION))) TARGET_SUFFIX=$(call qstrip,$(CONFIG_TARGET_SUFFIX)) BUILD_SUFFIX:=$(call qstrip,$(CONFIG_BUILD_SUFFIX)) SUBDIR:=$(patsubst $(TOPDIR)/%,%,${CURDIR}) diff --git a/target/linux/generic/pending-5.4/201-extra_optimization.patch b/target/linux/generic/pending-5.4/201-extra_optimization.patch index c606487992..4395a3e6a7 100644 --- a/target/linux/generic/pending-5.4/201-extra_optimization.patch +++ b/target/linux/generic/pending-5.4/201-extra_optimization.patch @@ -14,18 +14,12 @@ Signed-off-by: Felix Fietkau --- a/Makefile +++ b/Makefile -@@ -719,11 +719,11 @@ KBUILD_CFLAGS += $(call cc-disable-warni - KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member) - - ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE --KBUILD_CFLAGS += -O2 -+KBUILD_CFLAGS += -O2 $(EXTRA_OPTIMIZATION) +@@ -723,7 +723,7 @@ KBUILD_CFLAGS += -O2 else ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE_O3 --KBUILD_CFLAGS += -O3 -+KBUILD_CFLAGS += -O3 $(EXTRA_OPTIMIZATION) + KBUILD_CFLAGS += -O3 else ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE -KBUILD_CFLAGS += -Os -+KBUILD_CFLAGS += -Os -fno-reorder-blocks -fno-tree-ch $(EXTRA_OPTIMIZATION) ++KBUILD_CFLAGS += -Os -fno-reorder-blocks -fno-tree-ch endif # Tell gcc to never replace conditional load with a non-conditional one From b0968be02e264876e79e297d984ec82262344e7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Wed, 15 Jun 2022 12:36:36 +0200 Subject: [PATCH 2/6] kernel: support setting extra CFLAGS for kernel compilation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit They may be used e.g. to optimize kernel size or performance. Signed-off-by: Rafał Miłecki (cherry picked from commit 907d7d747243044f86588f0d82993e8c106cb02c) --- config/Config-devel.in | 4 ++++ include/kernel.mk | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/config/Config-devel.in b/config/Config-devel.in index 126462bfc3..a068f694e5 100644 --- a/config/Config-devel.in +++ b/config/Config-devel.in @@ -74,6 +74,10 @@ menuconfig DEVEL Store ccache in this directory. If not set, uses './.ccache' + config KERNEL_CFLAGS + string "Kernel extra CFLAGS" if DEVEL + default "" + config EXTERNAL_KERNEL_TREE string "Use external kernel tree" if DEVEL default "" diff --git a/include/kernel.mk b/include/kernel.mk index 5057d8bf6f..070d1bca75 100644 --- a/include/kernel.mk +++ b/include/kernel.mk @@ -101,7 +101,7 @@ endif KERNEL_MAKE = $(MAKE) $(KERNEL_MAKEOPTS) KERNEL_MAKE_FLAGS = \ - KCFLAGS="$(call iremap,$(BUILD_DIR),$(notdir $(BUILD_DIR))) $(filter-out -fno-plt,$(call qstrip,$(CONFIG_EXTRA_OPTIMIZATION)))" \ + KCFLAGS="$(call iremap,$(BUILD_DIR),$(notdir $(BUILD_DIR))) $(filter-out -fno-plt,$(call qstrip,$(CONFIG_EXTRA_OPTIMIZATION))) $(call qstrip,$(CONFIG_KERNEL_CFLAGS))" \ HOSTCFLAGS="$(HOST_CFLAGS) -Wall -Wmissing-prototypes -Wstrict-prototypes" \ CROSS_COMPILE="$(KERNEL_CROSS)" \ ARCH="$(LINUX_KARCH)" \ From 4ec80cd907f25a056c1bca82d6ab722e59321eba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Wed, 15 Jun 2022 12:36:37 +0200 Subject: [PATCH 3/6] kernel: drop patch adding hardcoded kernel compilation flags MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. KCFLAGS should be used for custom flags 2. Optimization flags are arch / SoC specific 3. -fno-reorder-blocks may *worsen* network performace on some SoCs 4. Usage of flags was *reversed* since 5.4 and noone reported that If we really need custom flags then CONFIG_KERNEL_CFLAGS should get default value adjusted properly (per target). Ref: 4e0c54bc5bc8 ("kernel: add support for kernel 5.4") Link: http://lists.openwrt.org/pipermail/openwrt-devel/2022-June/038853.html Link: https://patchwork.ozlabs.org/project/openwrt/patch/20190409093046.13401-1-zajec5@gmail.com/ Cc: Felix Fietkau Cc: Hauke Mehrtens Cc: Rui Salvaterra Signed-off-by: Rafał Miłecki Acked-by: Hauke Mehrtens (cherry picked from commit 22168ae68101b95d03741b0e9e8ad20b8a5ae5b7) --- .../pending-5.4/201-extra_optimization.patch | 25 ------------------- 1 file changed, 25 deletions(-) delete mode 100644 target/linux/generic/pending-5.4/201-extra_optimization.patch diff --git a/target/linux/generic/pending-5.4/201-extra_optimization.patch b/target/linux/generic/pending-5.4/201-extra_optimization.patch deleted file mode 100644 index 4395a3e6a7..0000000000 --- a/target/linux/generic/pending-5.4/201-extra_optimization.patch +++ /dev/null @@ -1,25 +0,0 @@ -From: Felix Fietkau -Subject: Upgrade to Linux 2.6.19 - -- Includes large parts of the patch from #1021 by dpalffy -- Includes RB532 NAND driver changes by n0-1 - -[john@phrozen.org: feix will add this to his upstream queue] - -lede-commit: bff468813f78f81e36ebb2a3f4354de7365e640f -Signed-off-by: Felix Fietkau ---- - Makefile | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - ---- a/Makefile -+++ b/Makefile -@@ -723,7 +723,7 @@ KBUILD_CFLAGS += -O2 - else ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE_O3 - KBUILD_CFLAGS += -O3 - else ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE --KBUILD_CFLAGS += -Os -+KBUILD_CFLAGS += -Os -fno-reorder-blocks -fno-tree-ch - endif - - # Tell gcc to never replace conditional load with a non-conditional one From c032ed3c267cae38be43991ce310883502c67f4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Mon, 20 Jun 2022 10:21:20 +0200 Subject: [PATCH 4/6] bcm53xx: disable GRO by default at kernel level MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This improves NAT masquarade network performance. An alternative to kernel change would be runtime setup but that requires ethtool and identifying relevant network interface and all related switch ports interfaces. Signed-off-by: Rafał Miłecki (cherry picked from commit 82d0dd8f8aa11249944fe39cd0d75a1524ec22ec) --- .../600-net-disable-GRO-by-default.patch | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 target/linux/bcm53xx/patches-5.4/600-net-disable-GRO-by-default.patch diff --git a/target/linux/bcm53xx/patches-5.4/600-net-disable-GRO-by-default.patch b/target/linux/bcm53xx/patches-5.4/600-net-disable-GRO-by-default.patch new file mode 100644 index 0000000000..a11054e718 --- /dev/null +++ b/target/linux/bcm53xx/patches-5.4/600-net-disable-GRO-by-default.patch @@ -0,0 +1,32 @@ +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Mon, 20 Jun 2022 10:01:18 +0200 +Subject: [PATCH] net: disable GRO by default +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +In many cases GRO improves network performance however it comes at a +cost of chacksums calculations. In case of slow CPU and missing hardware +csum calculation support GRO can actually decrease network speed. + +On BCM4708 *disabling* GRO results in following NAT masquarade speed +changes: +1. 364 Mb/s → 396 Mb/s (packet steering disabled) +2. 341 Mb/s → 566 Mb/s (packet steering enabled) + +Signed-off-by: Rafał Miłecki +--- + include/linux/netdev_features.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/include/linux/netdev_features.h ++++ b/include/linux/netdev_features.h +@@ -224,7 +224,7 @@ static inline int find_next_netdev_featu + #define NETIF_F_UPPER_DISABLES NETIF_F_LRO + + /* changeable features with no special hardware requirements */ +-#define NETIF_F_SOFT_FEATURES (NETIF_F_GSO | NETIF_F_GRO) ++#define NETIF_F_SOFT_FEATURES (NETIF_F_GSO) + + #define NETIF_F_VLAN_FEATURES (NETIF_F_HW_VLAN_CTAG_FILTER | \ + NETIF_F_HW_VLAN_CTAG_RX | \ From a50f5b3fb2024fe00f726dff2093a83410bd3c8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Fri, 10 Jun 2022 10:51:23 +0200 Subject: [PATCH 5/6] bcm53xx: enable & setup packet steering MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 (cherry picked from commit fcbd39689ebfef20c62fe3882d51f3af765e8028) --- .../bcm53xx/base-files/etc/init.d/fastnetwork | 44 +++++++++++++++++++ .../etc/uci-defaults/05_packet_steering | 3 ++ 2 files changed, 47 insertions(+) create mode 100755 target/linux/bcm53xx/base-files/etc/init.d/fastnetwork create mode 100644 target/linux/bcm53xx/base-files/etc/uci-defaults/05_packet_steering 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" From b54ef39e0b910a4b8eaca0497fe9b63e8392262a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Sun, 3 Jul 2022 13:22:00 +0200 Subject: [PATCH 6/6] bcm53xx: use -falign-functions=32 for kernel compilation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Northstar SoCs have pretty small CPU caches and their performance is heavily affected by cache hits & misses. It means that all kind of random code changes can affect performance as they often reorganize (change alignment & possibly reorder) kernel symbols. It was discussed in ARM / net mailinglists: 1. ARM router NAT performance affected by random/unrelated commits [1] [2] 2. Optimizing kernel compilation / alignments for network performance [3] [4] It seems that -falign-functions can be used as a partial workaround. It doesn't solve all cases (e.g. documented watchdog one [5]) but it surely helps with many of them. A complete long term solution may be PGO (profile-guided optimization) but it isn't available at this point. [1] https://lkml.org/lkml/2019/5/21/349 [2] https://www.spinics.net/lists/linux-block/msg40624.html [3] https://lore.kernel.org/linux-arm-kernel/066fc320-dc04-11a4-476e-b0d11f3b17e6@gmail.com/T/ [4] https://www.spinics.net/lists/netdev/msg816103.html [5] http://lists.openwrt.org/pipermail/openwrt-devel/2022-July/038989.html Signed-off-by: Rafał Miłecki (cherry picked from commit abc5b28db164dc2d807750cb2baae91e288c84a9) --- config/Config-devel.in | 1 + 1 file changed, 1 insertion(+) diff --git a/config/Config-devel.in b/config/Config-devel.in index a068f694e5..87f9157106 100644 --- a/config/Config-devel.in +++ b/config/Config-devel.in @@ -76,6 +76,7 @@ menuconfig DEVEL config KERNEL_CFLAGS string "Kernel extra CFLAGS" if DEVEL + default "-falign-functions=32" if TARGET_bcm53xx default "" config EXTERNAL_KERNEL_TREE