[openwrt/openwrt] ramips: fix locking issues in the ethernet driver

LEDE Commits lede-commits at lists.infradead.org
Tue Apr 17 02:30:18 PDT 2018


nbd pushed a commit to openwrt/openwrt.git, branch master:
https://git.lede-project.org/173d93ea23dabf4f08228dc2aaf70a004cf4141c

commit 173d93ea23dabf4f08228dc2aaf70a004cf4141c
Author: Felix Fietkau <nbd at nbd.name>
AuthorDate: Sun Apr 15 19:24:42 2018 +0200

    ramips: fix locking issues in the ethernet driver
    
    The stats update needs to protect against being interrupted by a tasklet
    The u64 stats seqlock needs to be initialized
    
    Signed-off-by: Felix Fietkau <nbd at nbd.name>
---
 .../linux/ramips/files-4.14/drivers/net/ethernet/mtk/mtk_eth_soc.c   | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/target/linux/ramips/files-4.14/drivers/net/ethernet/mtk/mtk_eth_soc.c b/target/linux/ramips/files-4.14/drivers/net/ethernet/mtk/mtk_eth_soc.c
index 49505ea..d0d88b9 100644
--- a/target/linux/ramips/files-4.14/drivers/net/ethernet/mtk/mtk_eth_soc.c
+++ b/target/linux/ramips/files-4.14/drivers/net/ethernet/mtk/mtk_eth_soc.c
@@ -477,9 +477,9 @@ static void fe_get_stats64(struct net_device *dev,
 	}
 
 	if (netif_running(dev) && netif_device_present(dev)) {
-		if (spin_trylock(&hwstats->stats_lock)) {
+		if (spin_trylock_bh(&hwstats->stats_lock)) {
 			fe_stats_update(priv);
-			spin_unlock(&hwstats->stats_lock);
+			spin_unlock_bh(&hwstats->stats_lock);
 		}
 	}
 
@@ -1581,6 +1581,7 @@ static int fe_probe(struct platform_device *pdev)
 	priv->tx_ring.tx_ring_size = NUM_DMA_DESC;
 	priv->rx_ring.rx_ring_size = NUM_DMA_DESC;
 	INIT_WORK(&priv->pending_work, fe_pending_work);
+	u64_stats_init(&priv->hw_stats->syncp);
 
 	napi_weight = 16;
 	if (priv->flags & FE_FLAG_NAPI_WEIGHT) {



More information about the lede-commits mailing list