Skip to content

Commit 9b3dc0a

Browse files
asdil12davem330
authored andcommitted
l2tp: cast l2tp traffic counter to unsigned
This fixes a counter problem on 32bit systems: When the rx_bytes counter reached 2 GiB, it jumpd to (2^64 Bytes - 2GiB) Bytes. rtnl_link_stats64 has __u64 type and atomic_long_read returns atomic_long_t which is signed. Due to the conversation we get an incorrect value on 32bit systems if the MSB of the atomic_long_t value is set. CC: Tom Parkin <[email protected]> Fixes: 7b7c071 ("l2tp: avoid deadlock in l2tp stats update") Signed-off-by: Dominik Heidler <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent d8dba51 commit 9b3dc0a

File tree

1 file changed

+7
-6
lines changed

1 file changed

+7
-6
lines changed

net/l2tp/l2tp_eth.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,12 +114,13 @@ static void l2tp_eth_get_stats64(struct net_device *dev,
114114
{
115115
struct l2tp_eth *priv = netdev_priv(dev);
116116

117-
stats->tx_bytes = atomic_long_read(&priv->tx_bytes);
118-
stats->tx_packets = atomic_long_read(&priv->tx_packets);
119-
stats->tx_dropped = atomic_long_read(&priv->tx_dropped);
120-
stats->rx_bytes = atomic_long_read(&priv->rx_bytes);
121-
stats->rx_packets = atomic_long_read(&priv->rx_packets);
122-
stats->rx_errors = atomic_long_read(&priv->rx_errors);
117+
stats->tx_bytes = (unsigned long) atomic_long_read(&priv->tx_bytes);
118+
stats->tx_packets = (unsigned long) atomic_long_read(&priv->tx_packets);
119+
stats->tx_dropped = (unsigned long) atomic_long_read(&priv->tx_dropped);
120+
stats->rx_bytes = (unsigned long) atomic_long_read(&priv->rx_bytes);
121+
stats->rx_packets = (unsigned long) atomic_long_read(&priv->rx_packets);
122+
stats->rx_errors = (unsigned long) atomic_long_read(&priv->rx_errors);
123+
123124
}
124125

125126
static const struct net_device_ops l2tp_eth_netdev_ops = {

0 commit comments

Comments
 (0)