mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-06 16:49:22 +00:00
ipvlan: properly track tx_errors
[ Upstream commitff672b9ffe
] Both ipvlan_process_v4_outbound() and ipvlan_process_v6_outbound() increment dev->stats.tx_errors in case of errors. Unfortunately there are two issues : 1) ipvlan_get_stats64() does not propagate dev->stats.tx_errors to user. 2) Increments are not atomic. KCSAN would complain eventually. Use DEV_STATS_INC() to not miss an update, and change ipvlan_get_stats64() to copy the value back to user. Fixes:2ad7bf3638
("ipvlan: Initial check-in of the IPVLAN driver.") Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Mahesh Bandewar <maheshb@google.com> Link: https://lore.kernel.org/r/20231026131446.3933175-1-edumazet@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
e897dcbd5f
commit
9954a7f380
2 changed files with 5 additions and 4 deletions
|
@ -442,12 +442,12 @@ static int ipvlan_process_v4_outbound(struct sk_buff *skb)
|
|||
|
||||
err = ip_local_out(net, skb->sk, skb);
|
||||
if (unlikely(net_xmit_eval(err)))
|
||||
dev->stats.tx_errors++;
|
||||
DEV_STATS_INC(dev, tx_errors);
|
||||
else
|
||||
ret = NET_XMIT_SUCCESS;
|
||||
goto out;
|
||||
err:
|
||||
dev->stats.tx_errors++;
|
||||
DEV_STATS_INC(dev, tx_errors);
|
||||
kfree_skb(skb);
|
||||
out:
|
||||
return ret;
|
||||
|
@ -483,12 +483,12 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb)
|
|||
|
||||
err = ip6_local_out(net, skb->sk, skb);
|
||||
if (unlikely(net_xmit_eval(err)))
|
||||
dev->stats.tx_errors++;
|
||||
DEV_STATS_INC(dev, tx_errors);
|
||||
else
|
||||
ret = NET_XMIT_SUCCESS;
|
||||
goto out;
|
||||
err:
|
||||
dev->stats.tx_errors++;
|
||||
DEV_STATS_INC(dev, tx_errors);
|
||||
kfree_skb(skb);
|
||||
out:
|
||||
return ret;
|
||||
|
|
|
@ -322,6 +322,7 @@ static void ipvlan_get_stats64(struct net_device *dev,
|
|||
s->rx_dropped = rx_errs;
|
||||
s->tx_dropped = tx_drps;
|
||||
}
|
||||
s->tx_errors = DEV_STATS_READ(dev, tx_errors);
|
||||
}
|
||||
|
||||
static int ipvlan_vlan_rx_add_vid(struct net_device *dev, __be16 proto, u16 vid)
|
||||
|
|
Loading…
Reference in a new issue