Skip to content

Commit e2e5c2a

Browse files
Eric Dumazetgregkh
Eric Dumazet
authored andcommitted
virtio_net: avoid data-races on dev->stats fields
[ Upstream commit d12a26b ] Use DEV_STATS_INC() and DEV_STATS_READ() which provide atomicity on paths that can be used concurrently. Reported-by: syzbot <[email protected]> Signed-off-by: Eric Dumazet <[email protected]> Reviewed-by: Xuan Zhuo <[email protected]> Cc: "Michael S. Tsirkin" <[email protected]> Cc: Jason Wang <[email protected]> Signed-off-by: David S. Miller <[email protected]> Stable-dep-of: 2311e06 ("virtio_net: fix missing dma unmap for resize") Signed-off-by: Sasha Levin <[email protected]>
1 parent 6d2e4e5 commit e2e5c2a

File tree

1 file changed

+15
-15
lines changed

1 file changed

+15
-15
lines changed

drivers/net/virtio_net.c

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1258,7 +1258,7 @@ static struct sk_buff *receive_small(struct net_device *dev,
12581258
if (unlikely(len > GOOD_PACKET_LEN)) {
12591259
pr_debug("%s: rx error: len %u exceeds max size %d\n",
12601260
dev->name, len, GOOD_PACKET_LEN);
1261-
dev->stats.rx_length_errors++;
1261+
DEV_STATS_INC(dev, rx_length_errors);
12621262
goto err;
12631263
}
12641264

@@ -1323,7 +1323,7 @@ static void mergeable_buf_free(struct receive_queue *rq, int num_buf,
13231323
if (unlikely(!buf)) {
13241324
pr_debug("%s: rx error: %d buffers missing\n",
13251325
dev->name, num_buf);
1326-
dev->stats.rx_length_errors++;
1326+
DEV_STATS_INC(dev, rx_length_errors);
13271327
break;
13281328
}
13291329
u64_stats_add(&stats->bytes, len);
@@ -1432,7 +1432,7 @@ static int virtnet_build_xdp_buff_mrg(struct net_device *dev,
14321432
pr_debug("%s: rx error: %d buffers out of %d missing\n",
14331433
dev->name, *num_buf,
14341434
virtio16_to_cpu(vi->vdev, hdr->num_buffers));
1435-
dev->stats.rx_length_errors++;
1435+
DEV_STATS_INC(dev, rx_length_errors);
14361436
goto err;
14371437
}
14381438

@@ -1451,7 +1451,7 @@ static int virtnet_build_xdp_buff_mrg(struct net_device *dev,
14511451
put_page(page);
14521452
pr_debug("%s: rx error: len %u exceeds truesize %lu\n",
14531453
dev->name, len, (unsigned long)(truesize - room));
1454-
dev->stats.rx_length_errors++;
1454+
DEV_STATS_INC(dev, rx_length_errors);
14551455
goto err;
14561456
}
14571457

@@ -1630,7 +1630,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
16301630
if (unlikely(len > truesize - room)) {
16311631
pr_debug("%s: rx error: len %u exceeds truesize %lu\n",
16321632
dev->name, len, (unsigned long)(truesize - room));
1633-
dev->stats.rx_length_errors++;
1633+
DEV_STATS_INC(dev, rx_length_errors);
16341634
goto err_skb;
16351635
}
16361636

@@ -1662,7 +1662,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
16621662
dev->name, num_buf,
16631663
virtio16_to_cpu(vi->vdev,
16641664
hdr->num_buffers));
1665-
dev->stats.rx_length_errors++;
1665+
DEV_STATS_INC(dev, rx_length_errors);
16661666
goto err_buf;
16671667
}
16681668

@@ -1676,7 +1676,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
16761676
if (unlikely(len > truesize - room)) {
16771677
pr_debug("%s: rx error: len %u exceeds truesize %lu\n",
16781678
dev->name, len, (unsigned long)(truesize - room));
1679-
dev->stats.rx_length_errors++;
1679+
DEV_STATS_INC(dev, rx_length_errors);
16801680
goto err_skb;
16811681
}
16821682

@@ -1763,7 +1763,7 @@ static void receive_buf(struct virtnet_info *vi, struct receive_queue *rq,
17631763

17641764
if (unlikely(len < vi->hdr_len + ETH_HLEN)) {
17651765
pr_debug("%s: short packet %i\n", dev->name, len);
1766-
dev->stats.rx_length_errors++;
1766+
DEV_STATS_INC(dev, rx_length_errors);
17671767
virtnet_rq_free_unused_buf(rq->vq, buf);
17681768
return;
17691769
}
@@ -1803,7 +1803,7 @@ static void receive_buf(struct virtnet_info *vi, struct receive_queue *rq,
18031803
return;
18041804

18051805
frame_err:
1806-
dev->stats.rx_frame_errors++;
1806+
DEV_STATS_INC(dev, rx_frame_errors);
18071807
dev_kfree_skb(skb);
18081808
}
18091809

@@ -2352,12 +2352,12 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
23522352

23532353
/* This should not happen! */
23542354
if (unlikely(err)) {
2355-
dev->stats.tx_fifo_errors++;
2355+
DEV_STATS_INC(dev, tx_fifo_errors);
23562356
if (net_ratelimit())
23572357
dev_warn(&dev->dev,
23582358
"Unexpected TXQ (%d) queue failure: %d\n",
23592359
qnum, err);
2360-
dev->stats.tx_dropped++;
2360+
DEV_STATS_INC(dev, tx_dropped);
23612361
dev_kfree_skb_any(skb);
23622362
return NETDEV_TX_OK;
23632363
}
@@ -2576,10 +2576,10 @@ static void virtnet_stats(struct net_device *dev,
25762576
tot->tx_errors += terrors;
25772577
}
25782578

2579-
tot->tx_dropped = dev->stats.tx_dropped;
2580-
tot->tx_fifo_errors = dev->stats.tx_fifo_errors;
2581-
tot->rx_length_errors = dev->stats.rx_length_errors;
2582-
tot->rx_frame_errors = dev->stats.rx_frame_errors;
2579+
tot->tx_dropped = DEV_STATS_READ(dev, tx_dropped);
2580+
tot->tx_fifo_errors = DEV_STATS_READ(dev, tx_fifo_errors);
2581+
tot->rx_length_errors = DEV_STATS_READ(dev, rx_length_errors);
2582+
tot->rx_frame_errors = DEV_STATS_READ(dev, rx_frame_errors);
25832583
}
25842584

25852585
static void virtnet_ack_link_announce(struct virtnet_info *vi)

0 commit comments

Comments
 (0)