net: natsemi: fix `rx_dropped` double accounting on `netif_rx()` failure
authorYeounsu Moon <yyyynoom@gmail.com>
Sat, 13 Sep 2025 06:01:36 +0000 (15:01 +0900)
committerJakub Kicinski <kuba@kernel.org>
Tue, 16 Sep 2025 02:06:25 +0000 (19:06 -0700)
`netif_rx()` already increments `rx_dropped` core stat when it fails.
The driver was also updating `ndev->stats.rx_dropped` in the same path.
Since both are reported together via `ip -s -s` command, this resulted
in drops being counted twice in user-visible stats.

Keep the driver update on `if (unlikely(!skb))`, but skip it after
`netif_rx()` errors.

Fixes: caf586e5f23c ("net: add a core netdev->rx_dropped counter")
Signed-off-by: Yeounsu Moon <yyyynoom@gmail.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20250913060135.35282-3-yyyynoom@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/natsemi/ns83820.c

index 56d5464222d97a00de32e74cc9effded9ef3f388..cdbf82affa7beab058c873ae16711d6734fe9c4e 100644 (file)
@@ -820,7 +820,7 @@ static void rx_irq(struct net_device *ndev)
        struct ns83820 *dev = PRIV(ndev);
        struct rx_info *info = &dev->rx_info;
        unsigned next_rx;
-       int rx_rc, len;
+       int len;
        u32 cmdsts;
        __le32 *desc;
        unsigned long flags;
@@ -881,8 +881,10 @@ static void rx_irq(struct net_device *ndev)
                if (likely(CMDSTS_OK & cmdsts)) {
 #endif
                        skb_put(skb, len);
-                       if (unlikely(!skb))
+                       if (unlikely(!skb)) {
+                               ndev->stats.rx_dropped++;
                                goto netdev_mangle_me_harder_failed;
+                       }
                        if (cmdsts & CMDSTS_DEST_MULTI)
                                ndev->stats.multicast++;
                        ndev->stats.rx_packets++;
@@ -901,15 +903,12 @@ static void rx_irq(struct net_device *ndev)
                                __vlan_hwaccel_put_tag(skb, htons(ETH_P_IPV6), tag);
                        }
 #endif
-                       rx_rc = netif_rx(skb);
-                       if (NET_RX_DROP == rx_rc) {
-netdev_mangle_me_harder_failed:
-                               ndev->stats.rx_dropped++;
-                       }
+                       netif_rx(skb);
                } else {
                        dev_kfree_skb_irq(skb);
                }
 
+netdev_mangle_me_harder_failed:
                nr++;
                next_rx = info->next_rx;
                desc = info->descs + (DESC_SIZE * next_rx);