Commit c1157c11 authored by David S. Miller's avatar David S. Miller

Merge branch 'dev-stats-virtio-l2tp_eth'

Eric Dumazet says:

====================
net: use DEV_STATS_xxx() helpers in virtio_net and l2tp_eth

Inspired by another (minor) KCSAN syzbot report.
Both virtio_net and l2tp_eth can use DEV_STATS_xxx() helpers.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents a63df366 a56d9390
...@@ -3655,9 +3655,9 @@ static void macsec_get_stats64(struct net_device *dev, ...@@ -3655,9 +3655,9 @@ static void macsec_get_stats64(struct net_device *dev,
dev_fetch_sw_netstats(s, dev->tstats); dev_fetch_sw_netstats(s, dev->tstats);
s->rx_dropped = atomic_long_read(&dev->stats.__rx_dropped); s->rx_dropped = DEV_STATS_READ(dev, rx_dropped);
s->tx_dropped = atomic_long_read(&dev->stats.__tx_dropped); s->tx_dropped = DEV_STATS_READ(dev, tx_dropped);
s->rx_errors = atomic_long_read(&dev->stats.__rx_errors); s->rx_errors = DEV_STATS_READ(dev, rx_errors);
} }
static int macsec_get_iflink(const struct net_device *dev) static int macsec_get_iflink(const struct net_device *dev)
......
...@@ -1258,7 +1258,7 @@ static struct sk_buff *receive_small(struct net_device *dev, ...@@ -1258,7 +1258,7 @@ static struct sk_buff *receive_small(struct net_device *dev,
if (unlikely(len > GOOD_PACKET_LEN)) { if (unlikely(len > GOOD_PACKET_LEN)) {
pr_debug("%s: rx error: len %u exceeds max size %d\n", pr_debug("%s: rx error: len %u exceeds max size %d\n",
dev->name, len, GOOD_PACKET_LEN); dev->name, len, GOOD_PACKET_LEN);
dev->stats.rx_length_errors++; DEV_STATS_INC(dev, rx_length_errors);
goto err; goto err;
} }
...@@ -1323,7 +1323,7 @@ static void mergeable_buf_free(struct receive_queue *rq, int num_buf, ...@@ -1323,7 +1323,7 @@ static void mergeable_buf_free(struct receive_queue *rq, int num_buf,
if (unlikely(!buf)) { if (unlikely(!buf)) {
pr_debug("%s: rx error: %d buffers missing\n", pr_debug("%s: rx error: %d buffers missing\n",
dev->name, num_buf); dev->name, num_buf);
dev->stats.rx_length_errors++; DEV_STATS_INC(dev, rx_length_errors);
break; break;
} }
stats->bytes += len; stats->bytes += len;
...@@ -1432,7 +1432,7 @@ static int virtnet_build_xdp_buff_mrg(struct net_device *dev, ...@@ -1432,7 +1432,7 @@ static int virtnet_build_xdp_buff_mrg(struct net_device *dev,
pr_debug("%s: rx error: %d buffers out of %d missing\n", pr_debug("%s: rx error: %d buffers out of %d missing\n",
dev->name, *num_buf, dev->name, *num_buf,
virtio16_to_cpu(vi->vdev, hdr->num_buffers)); virtio16_to_cpu(vi->vdev, hdr->num_buffers));
dev->stats.rx_length_errors++; DEV_STATS_INC(dev, rx_length_errors);
goto err; goto err;
} }
...@@ -1451,7 +1451,7 @@ static int virtnet_build_xdp_buff_mrg(struct net_device *dev, ...@@ -1451,7 +1451,7 @@ static int virtnet_build_xdp_buff_mrg(struct net_device *dev,
put_page(page); put_page(page);
pr_debug("%s: rx error: len %u exceeds truesize %lu\n", pr_debug("%s: rx error: len %u exceeds truesize %lu\n",
dev->name, len, (unsigned long)(truesize - room)); dev->name, len, (unsigned long)(truesize - room));
dev->stats.rx_length_errors++; DEV_STATS_INC(dev, rx_length_errors);
goto err; goto err;
} }
...@@ -1630,7 +1630,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, ...@@ -1630,7 +1630,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
if (unlikely(len > truesize - room)) { if (unlikely(len > truesize - room)) {
pr_debug("%s: rx error: len %u exceeds truesize %lu\n", pr_debug("%s: rx error: len %u exceeds truesize %lu\n",
dev->name, len, (unsigned long)(truesize - room)); dev->name, len, (unsigned long)(truesize - room));
dev->stats.rx_length_errors++; DEV_STATS_INC(dev, rx_length_errors);
goto err_skb; goto err_skb;
} }
...@@ -1662,7 +1662,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, ...@@ -1662,7 +1662,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
dev->name, num_buf, dev->name, num_buf,
virtio16_to_cpu(vi->vdev, virtio16_to_cpu(vi->vdev,
hdr->num_buffers)); hdr->num_buffers));
dev->stats.rx_length_errors++; DEV_STATS_INC(dev, rx_length_errors);
goto err_buf; goto err_buf;
} }
...@@ -1676,7 +1676,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, ...@@ -1676,7 +1676,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
if (unlikely(len > truesize - room)) { if (unlikely(len > truesize - room)) {
pr_debug("%s: rx error: len %u exceeds truesize %lu\n", pr_debug("%s: rx error: len %u exceeds truesize %lu\n",
dev->name, len, (unsigned long)(truesize - room)); dev->name, len, (unsigned long)(truesize - room));
dev->stats.rx_length_errors++; DEV_STATS_INC(dev, rx_length_errors);
goto err_skb; goto err_skb;
} }
...@@ -1763,7 +1763,7 @@ static void receive_buf(struct virtnet_info *vi, struct receive_queue *rq, ...@@ -1763,7 +1763,7 @@ static void receive_buf(struct virtnet_info *vi, struct receive_queue *rq,
if (unlikely(len < vi->hdr_len + ETH_HLEN)) { if (unlikely(len < vi->hdr_len + ETH_HLEN)) {
pr_debug("%s: short packet %i\n", dev->name, len); pr_debug("%s: short packet %i\n", dev->name, len);
dev->stats.rx_length_errors++; DEV_STATS_INC(dev, rx_length_errors);
virtnet_rq_free_unused_buf(rq->vq, buf); virtnet_rq_free_unused_buf(rq->vq, buf);
return; return;
} }
...@@ -1803,7 +1803,7 @@ static void receive_buf(struct virtnet_info *vi, struct receive_queue *rq, ...@@ -1803,7 +1803,7 @@ static void receive_buf(struct virtnet_info *vi, struct receive_queue *rq,
return; return;
frame_err: frame_err:
dev->stats.rx_frame_errors++; DEV_STATS_INC(dev, rx_frame_errors);
dev_kfree_skb(skb); dev_kfree_skb(skb);
} }
...@@ -2349,12 +2349,12 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -2349,12 +2349,12 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
/* This should not happen! */ /* This should not happen! */
if (unlikely(err)) { if (unlikely(err)) {
dev->stats.tx_fifo_errors++; DEV_STATS_INC(dev, tx_fifo_errors);
if (net_ratelimit()) if (net_ratelimit())
dev_warn(&dev->dev, dev_warn(&dev->dev,
"Unexpected TXQ (%d) queue failure: %d\n", "Unexpected TXQ (%d) queue failure: %d\n",
qnum, err); qnum, err);
dev->stats.tx_dropped++; DEV_STATS_INC(dev, tx_dropped);
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
...@@ -2573,10 +2573,10 @@ static void virtnet_stats(struct net_device *dev, ...@@ -2573,10 +2573,10 @@ static void virtnet_stats(struct net_device *dev,
tot->tx_errors += terrors; tot->tx_errors += terrors;
} }
tot->tx_dropped = dev->stats.tx_dropped; tot->tx_dropped = DEV_STATS_READ(dev, tx_dropped);
tot->tx_fifo_errors = dev->stats.tx_fifo_errors; tot->tx_fifo_errors = DEV_STATS_READ(dev, tx_fifo_errors);
tot->rx_length_errors = dev->stats.rx_length_errors; tot->rx_length_errors = DEV_STATS_READ(dev, rx_length_errors);
tot->rx_frame_errors = dev->stats.rx_frame_errors; tot->rx_frame_errors = DEV_STATS_READ(dev, rx_frame_errors);
} }
static void virtnet_ack_link_announce(struct virtnet_info *vi) static void virtnet_ack_link_announce(struct virtnet_info *vi)
......
...@@ -5236,5 +5236,6 @@ extern struct net_device *blackhole_netdev; ...@@ -5236,5 +5236,6 @@ extern struct net_device *blackhole_netdev;
#define DEV_STATS_INC(DEV, FIELD) atomic_long_inc(&(DEV)->stats.__##FIELD) #define DEV_STATS_INC(DEV, FIELD) atomic_long_inc(&(DEV)->stats.__##FIELD)
#define DEV_STATS_ADD(DEV, FIELD, VAL) \ #define DEV_STATS_ADD(DEV, FIELD, VAL) \
atomic_long_add((VAL), &(DEV)->stats.__##FIELD) atomic_long_add((VAL), &(DEV)->stats.__##FIELD)
#define DEV_STATS_READ(DEV, FIELD) atomic_long_read(&(DEV)->stats.__##FIELD)
#endif /* _LINUX_NETDEVICE_H */ #endif /* _LINUX_NETDEVICE_H */
...@@ -37,12 +37,6 @@ ...@@ -37,12 +37,6 @@
/* via netdev_priv() */ /* via netdev_priv() */
struct l2tp_eth { struct l2tp_eth {
struct l2tp_session *session; struct l2tp_session *session;
atomic_long_t tx_bytes;
atomic_long_t tx_packets;
atomic_long_t tx_dropped;
atomic_long_t rx_bytes;
atomic_long_t rx_packets;
atomic_long_t rx_errors;
}; };
/* via l2tp_session_priv() */ /* via l2tp_session_priv() */
...@@ -79,10 +73,10 @@ static netdev_tx_t l2tp_eth_dev_xmit(struct sk_buff *skb, struct net_device *dev ...@@ -79,10 +73,10 @@ static netdev_tx_t l2tp_eth_dev_xmit(struct sk_buff *skb, struct net_device *dev
int ret = l2tp_xmit_skb(session, skb); int ret = l2tp_xmit_skb(session, skb);
if (likely(ret == NET_XMIT_SUCCESS)) { if (likely(ret == NET_XMIT_SUCCESS)) {
atomic_long_add(len, &priv->tx_bytes); DEV_STATS_ADD(dev, tx_bytes, len);
atomic_long_inc(&priv->tx_packets); DEV_STATS_INC(dev, tx_packets);
} else { } else {
atomic_long_inc(&priv->tx_dropped); DEV_STATS_INC(dev, tx_dropped);
} }
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
...@@ -90,14 +84,12 @@ static netdev_tx_t l2tp_eth_dev_xmit(struct sk_buff *skb, struct net_device *dev ...@@ -90,14 +84,12 @@ static netdev_tx_t l2tp_eth_dev_xmit(struct sk_buff *skb, struct net_device *dev
static void l2tp_eth_get_stats64(struct net_device *dev, static void l2tp_eth_get_stats64(struct net_device *dev,
struct rtnl_link_stats64 *stats) struct rtnl_link_stats64 *stats)
{ {
struct l2tp_eth *priv = netdev_priv(dev); stats->tx_bytes = DEV_STATS_READ(dev, tx_bytes);
stats->tx_packets = DEV_STATS_READ(dev, tx_packets);
stats->tx_bytes = (unsigned long)atomic_long_read(&priv->tx_bytes); stats->tx_dropped = DEV_STATS_READ(dev, tx_dropped);
stats->tx_packets = (unsigned long)atomic_long_read(&priv->tx_packets); stats->rx_bytes = DEV_STATS_READ(dev, rx_bytes);
stats->tx_dropped = (unsigned long)atomic_long_read(&priv->tx_dropped); stats->rx_packets = DEV_STATS_READ(dev, rx_packets);
stats->rx_bytes = (unsigned long)atomic_long_read(&priv->rx_bytes); stats->rx_errors = DEV_STATS_READ(dev, rx_errors);
stats->rx_packets = (unsigned long)atomic_long_read(&priv->rx_packets);
stats->rx_errors = (unsigned long)atomic_long_read(&priv->rx_errors);
} }
static const struct net_device_ops l2tp_eth_netdev_ops = { static const struct net_device_ops l2tp_eth_netdev_ops = {
...@@ -126,7 +118,6 @@ static void l2tp_eth_dev_recv(struct l2tp_session *session, struct sk_buff *skb, ...@@ -126,7 +118,6 @@ static void l2tp_eth_dev_recv(struct l2tp_session *session, struct sk_buff *skb,
{ {
struct l2tp_eth_sess *spriv = l2tp_session_priv(session); struct l2tp_eth_sess *spriv = l2tp_session_priv(session);
struct net_device *dev; struct net_device *dev;
struct l2tp_eth *priv;
if (!pskb_may_pull(skb, ETH_HLEN)) if (!pskb_may_pull(skb, ETH_HLEN))
goto error; goto error;
...@@ -144,12 +135,11 @@ static void l2tp_eth_dev_recv(struct l2tp_session *session, struct sk_buff *skb, ...@@ -144,12 +135,11 @@ static void l2tp_eth_dev_recv(struct l2tp_session *session, struct sk_buff *skb,
if (!dev) if (!dev)
goto error_rcu; goto error_rcu;
priv = netdev_priv(dev);
if (dev_forward_skb(dev, skb) == NET_RX_SUCCESS) { if (dev_forward_skb(dev, skb) == NET_RX_SUCCESS) {
atomic_long_inc(&priv->rx_packets); DEV_STATS_INC(dev, rx_packets);
atomic_long_add(data_len, &priv->rx_bytes); DEV_STATS_ADD(dev, rx_bytes, data_len);
} else { } else {
atomic_long_inc(&priv->rx_errors); DEV_STATS_INC(dev, rx_errors);
} }
rcu_read_unlock(); rcu_read_unlock();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment