Commit 93ab4881 authored by Yeounsu Moon's avatar Yeounsu Moon Committed by Jakub Kicinski
Browse files

net: natsemi: fix `rx_dropped` double accounting on `netif_rx()` failure



`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: caf586e5 ("net: add a core netdev->rx_dropped counter")
Signed-off-by: default avatarYeounsu Moon <yyyynoom@gmail.com>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20250913060135.35282-3-yyyynoom@gmail.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 97499e28
Loading
Loading
Loading
Loading
+6 −7
Original line number Diff line number Diff line
@@ -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);