From 7c062f7daeca83e19b050b8e7ac6bf6aa6635693 Mon Sep 17 00:00:00 2001 From: Paolo Sabatino Date: Tue, 6 Feb 2024 20:46:14 +0100 Subject: [PATCH] rockchip: workaround stmmac ethernet lock contemption --- .../rockchip-6.6/hack-barrier-stmmac.patch | 40 +++++++++++++++++++ .../rockchip-6.7/hack-barrier-stmmac.patch | 40 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 patch/kernel/archive/rockchip-6.6/hack-barrier-stmmac.patch create mode 100644 patch/kernel/archive/rockchip-6.7/hack-barrier-stmmac.patch diff --git a/patch/kernel/archive/rockchip-6.6/hack-barrier-stmmac.patch b/patch/kernel/archive/rockchip-6.6/hack-barrier-stmmac.patch new file mode 100644 index 0000000000..0fb9025107 --- /dev/null +++ b/patch/kernel/archive/rockchip-6.6/hack-barrier-stmmac.patch @@ -0,0 +1,40 @@ +diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +index 292857c0e601..4417b10da438 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +@@ -6952,7 +6952,6 @@ static void stmmac_get_stats64(struct net_device *dev, struct rtnl_link_stats64 + struct stmmac_priv *priv = netdev_priv(dev); + u32 tx_cnt = priv->plat->tx_queues_to_use; + u32 rx_cnt = priv->plat->rx_queues_to_use; +- unsigned int start; + int q; + + for (q = 0; q < tx_cnt; q++) { +@@ -6960,11 +6959,8 @@ static void stmmac_get_stats64(struct net_device *dev, struct rtnl_link_stats64 + u64 tx_packets; + u64 tx_bytes; + +- do { +- start = u64_stats_fetch_begin(&txq_stats->syncp); +- tx_packets = txq_stats->tx_packets; +- tx_bytes = txq_stats->tx_bytes; +- } while (u64_stats_fetch_retry(&txq_stats->syncp, start)); ++ tx_packets = txq_stats->tx_packets; ++ tx_bytes = txq_stats->tx_bytes; + + stats->tx_packets += tx_packets; + stats->tx_bytes += tx_bytes; +@@ -6975,11 +6971,8 @@ static void stmmac_get_stats64(struct net_device *dev, struct rtnl_link_stats64 + u64 rx_packets; + u64 rx_bytes; + +- do { +- start = u64_stats_fetch_begin(&rxq_stats->syncp); +- rx_packets = rxq_stats->rx_packets; +- rx_bytes = rxq_stats->rx_bytes; +- } while (u64_stats_fetch_retry(&rxq_stats->syncp, start)); ++ rx_packets = rxq_stats->rx_packets; ++ rx_bytes = rxq_stats->rx_bytes; + + stats->rx_packets += rx_packets; + stats->rx_bytes += rx_bytes; diff --git a/patch/kernel/archive/rockchip-6.7/hack-barrier-stmmac.patch b/patch/kernel/archive/rockchip-6.7/hack-barrier-stmmac.patch new file mode 100644 index 0000000000..0fb9025107 --- /dev/null +++ b/patch/kernel/archive/rockchip-6.7/hack-barrier-stmmac.patch @@ -0,0 +1,40 @@ +diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +index 292857c0e601..4417b10da438 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +@@ -6952,7 +6952,6 @@ static void stmmac_get_stats64(struct net_device *dev, struct rtnl_link_stats64 + struct stmmac_priv *priv = netdev_priv(dev); + u32 tx_cnt = priv->plat->tx_queues_to_use; + u32 rx_cnt = priv->plat->rx_queues_to_use; +- unsigned int start; + int q; + + for (q = 0; q < tx_cnt; q++) { +@@ -6960,11 +6959,8 @@ static void stmmac_get_stats64(struct net_device *dev, struct rtnl_link_stats64 + u64 tx_packets; + u64 tx_bytes; + +- do { +- start = u64_stats_fetch_begin(&txq_stats->syncp); +- tx_packets = txq_stats->tx_packets; +- tx_bytes = txq_stats->tx_bytes; +- } while (u64_stats_fetch_retry(&txq_stats->syncp, start)); ++ tx_packets = txq_stats->tx_packets; ++ tx_bytes = txq_stats->tx_bytes; + + stats->tx_packets += tx_packets; + stats->tx_bytes += tx_bytes; +@@ -6975,11 +6971,8 @@ static void stmmac_get_stats64(struct net_device *dev, struct rtnl_link_stats64 + u64 rx_packets; + u64 rx_bytes; + +- do { +- start = u64_stats_fetch_begin(&rxq_stats->syncp); +- rx_packets = rxq_stats->rx_packets; +- rx_bytes = rxq_stats->rx_bytes; +- } while (u64_stats_fetch_retry(&rxq_stats->syncp, start)); ++ rx_packets = rxq_stats->rx_packets; ++ rx_bytes = rxq_stats->rx_bytes; + + stats->rx_packets += rx_packets; + stats->rx_bytes += rx_bytes;