mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 11:06:41 -05:00
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: caf586e5f2 ("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>
This commit is contained in:
committed by
Jakub Kicinski
parent
97499e2818
commit
93ab4881a4
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user