From 217a4fa43ba2ad0a02e8080dfde11ad23534aa8c Mon Sep 17 00:00:00 2001 From: Sean Khan Date: Sat, 13 Jul 2024 18:43:52 -0400 Subject: [PATCH] nss-drv: add skb_recycler init script This script is meant to set various skb_recycler settings. There is a similar version in QSDK, but it's packaged in the main repo, rather than an external package like 'qca-nss-drv'. To avoid making too many changes in the main repo, introduce this script in `qca-nss-drv`. This script will read the following config: /etc/config/skb_recycler ``` config skb_recycler 'opt' option max_skbs '1024' option max_spare_skbs '256' option enable '1' ``` Users are encouraged to experiment disabling `skb_recycler` to see if memory leaks are still occuring, especially on 512M boards. There are issues currently where skb_recycler corrupts skbs during times of high traffic, but there wasn't a way to completely disable it. Signed-off-by: Sean Khan --- qca-nss-drv/Makefile | 4 +- qca-nss-drv/files/skb_recycler.init | 92 +++++++++++++++++++++++++++++ qca-nss-drv/files/skb_recycler.uci | 6 ++ 3 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 qca-nss-drv/files/skb_recycler.init create mode 100644 qca-nss-drv/files/skb_recycler.uci diff --git a/qca-nss-drv/Makefile b/qca-nss-drv/Makefile index 9111a02..e220b8d 100644 --- a/qca-nss-drv/Makefile +++ b/qca-nss-drv/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=qca-nss-drv -PKG_RELEASE:=10 +PKG_RELEASE:=11 PKG_SOURCE_URL:=https://git.codelinaro.org/clo/qsdk/oss/lklm/nss-drv.git PKG_SOURCE_PROTO:=git @@ -97,6 +97,7 @@ define KernelPackage/qca-nss-drv/install $(INSTALL_DIR) $(1)/etc/hotplug.d/firmware $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) ./files/skb_recycler.init $(1)/etc/init.d/skb_recycler $(INSTALL_BIN) ./files/qca-nss-drv.init $(1)/etc/init.d/qca-nss-drv $(INSTALL_DATA) ./files/qca-nss-drv.uci $(1)/etc/config/nss $(INSTALL_DATA) ./files/qca-nss-drv.hotplug $(1)/etc/hotplug.d/firmware/10-qca-nss-fw @@ -106,6 +107,7 @@ endef define KernelPackage/qca-nss-drv/conffiles /etc/config/nss +/etc/config/skb_recycler endef define KernelPackage/qca-nss-drv/Description diff --git a/qca-nss-drv/files/skb_recycler.init b/qca-nss-drv/files/skb_recycler.init new file mode 100644 index 0000000..5cfaeef --- /dev/null +++ b/qca-nss-drv/files/skb_recycler.init @@ -0,0 +1,92 @@ +#!/bin/sh /etc/rc.common +# shellcheck disable=3043 + +START=40 +USE_PROCD=1 +NAME=skb_recycler + +ucidef_set_skb_recycler() { + uci import << EOF +package $NAME +config $NAME 'opt' +EOF + +} + +skb_recycler_config() { + + . /lib/config/uci.sh + + local CFG + local max_skbs + local max_spare_skbs + local enable + local memtotal + CFG="$1" + + config_get max_skbs "${CFG}" max_skbs + config_get max_spare_skbs "${CFG}" max_spare_skbs + config_get enable "${CFG}" enable + + memtotal=$(awk '/MemTotal/{print $2}' /proc/meminfo) + + [ -z "$max_skbs" ] && { + [ $memtotal -le 512000 ] && max_skbs=512 || max_skbs=1024 + uci_set $NAME "${CFG}" max_skbs "$max_skbs" + uci_commit "$NAME" + } + + [ -z "$max_spare_skbs" ] && { + [ $memtotal -le 512000 ] && max_spare_skbs=128 || max_spare_skbs=256 + uci_set $NAME "${CFG}" max_spare_skbs "$max_spare_skbs" + uci_commit "$NAME" + } + + [ -z "$enable" ] && { + [ $memtotal -le 256000 ] && enable=0 || enable=1 + uci_set $NAME "${CFG}" enable "$enable" + uci_commit "$NAME" + } + + [ "$enable" -eq 0 ] && enable_disable="Disabling" || enable_disable="Enabling" + + if [ -r "/proc/net/$NAME/skb_recycler_enable" ]; then + logger -t "$NAME" -p user.notice "$enable_disable $NAME" + echo "$enable" > /proc/net/$NAME/skb_recycler_enable + else + if [ "$enable" -eq 0 ]; then + logger -t "$NAME" -p user.warn "$NAME kernel feature 'skb_recycler_enable' not available" + logger -t "$NAME" -p user.notice "$enable_disable $NAME" + echo 1 > /proc/net/$NAME/max_skbs + echo 1 > /proc/net/$NAME/max_spare_skbs + echo 1 > /proc/net/$NAME/flush + fi + fi + + logger -t "$NAME" -p user.notice "Setting max_skbs to $max_skbs" + echo "$max_skbs" > /proc/net/$NAME/max_skbs + + logger -t "$NAME" -p user.notice "Setting max_spare_skbs to $max_spare_skbs" + echo "$max_spare_skbs" > /proc/net/$NAME/max_spare_skbs + + [ "$enable" -eq 0 ] && echo 1 > /proc/net/$NAME/flush +} + +check_config() { + config_load "$NAME" || { + touch /etc/config/$NAME + ucidef_set_skb_recycler + } +} + +reload_service() { + [ ! -r /proc/net/$NAME ] && logger -t "$NAME" -p user.warn "skb_recycler feature not available" && return + + check_config + config_load $NAME + config_foreach skb_recycler_config $NAME +} + +start_service() { + reload_service +} diff --git a/qca-nss-drv/files/skb_recycler.uci b/qca-nss-drv/files/skb_recycler.uci new file mode 100644 index 0000000..c9ee862 --- /dev/null +++ b/qca-nss-drv/files/skb_recycler.uci @@ -0,0 +1,6 @@ + +config skb_recycler 'opt' + option max_skbs '1024' + option max_spare_skbs '512' + option enable '0' +