Commit 32d0a49d authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

macsec: use DEV_STATS_INC()

syzbot/KCSAN reported data-races in macsec whenever dev->stats fields
are updated.

It appears all of these updates can happen from multiple cpus.

Adopt SMP safe DEV_STATS_INC() to update dev->stats fields.

Fixes: c09440f7 ("macsec: introduce IEEE 802.1AE driver")
Reported-by: default avatarsyzbot <syzkaller@googlegroups.com>
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Cc: Sabrina Dubroca <sd@queasysnail.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6b47808f
...@@ -743,7 +743,7 @@ static bool macsec_post_decrypt(struct sk_buff *skb, struct macsec_secy *secy, u ...@@ -743,7 +743,7 @@ static bool macsec_post_decrypt(struct sk_buff *skb, struct macsec_secy *secy, u
u64_stats_update_begin(&rxsc_stats->syncp); u64_stats_update_begin(&rxsc_stats->syncp);
rxsc_stats->stats.InPktsLate++; rxsc_stats->stats.InPktsLate++;
u64_stats_update_end(&rxsc_stats->syncp); u64_stats_update_end(&rxsc_stats->syncp);
secy->netdev->stats.rx_dropped++; DEV_STATS_INC(secy->netdev, rx_dropped);
return false; return false;
} }
...@@ -767,7 +767,7 @@ static bool macsec_post_decrypt(struct sk_buff *skb, struct macsec_secy *secy, u ...@@ -767,7 +767,7 @@ static bool macsec_post_decrypt(struct sk_buff *skb, struct macsec_secy *secy, u
rxsc_stats->stats.InPktsNotValid++; rxsc_stats->stats.InPktsNotValid++;
u64_stats_update_end(&rxsc_stats->syncp); u64_stats_update_end(&rxsc_stats->syncp);
this_cpu_inc(rx_sa->stats->InPktsNotValid); this_cpu_inc(rx_sa->stats->InPktsNotValid);
secy->netdev->stats.rx_errors++; DEV_STATS_INC(secy->netdev, rx_errors);
return false; return false;
} }
...@@ -1069,7 +1069,7 @@ static enum rx_handler_result handle_not_macsec(struct sk_buff *skb) ...@@ -1069,7 +1069,7 @@ static enum rx_handler_result handle_not_macsec(struct sk_buff *skb)
u64_stats_update_begin(&secy_stats->syncp); u64_stats_update_begin(&secy_stats->syncp);
secy_stats->stats.InPktsNoTag++; secy_stats->stats.InPktsNoTag++;
u64_stats_update_end(&secy_stats->syncp); u64_stats_update_end(&secy_stats->syncp);
macsec->secy.netdev->stats.rx_dropped++; DEV_STATS_INC(macsec->secy.netdev, rx_dropped);
continue; continue;
} }
...@@ -1179,7 +1179,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb) ...@@ -1179,7 +1179,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb)
u64_stats_update_begin(&secy_stats->syncp); u64_stats_update_begin(&secy_stats->syncp);
secy_stats->stats.InPktsBadTag++; secy_stats->stats.InPktsBadTag++;
u64_stats_update_end(&secy_stats->syncp); u64_stats_update_end(&secy_stats->syncp);
secy->netdev->stats.rx_errors++; DEV_STATS_INC(secy->netdev, rx_errors);
goto drop_nosa; goto drop_nosa;
} }
...@@ -1196,7 +1196,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb) ...@@ -1196,7 +1196,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb)
u64_stats_update_begin(&rxsc_stats->syncp); u64_stats_update_begin(&rxsc_stats->syncp);
rxsc_stats->stats.InPktsNotUsingSA++; rxsc_stats->stats.InPktsNotUsingSA++;
u64_stats_update_end(&rxsc_stats->syncp); u64_stats_update_end(&rxsc_stats->syncp);
secy->netdev->stats.rx_errors++; DEV_STATS_INC(secy->netdev, rx_errors);
if (active_rx_sa) if (active_rx_sa)
this_cpu_inc(active_rx_sa->stats->InPktsNotUsingSA); this_cpu_inc(active_rx_sa->stats->InPktsNotUsingSA);
goto drop_nosa; goto drop_nosa;
...@@ -1230,7 +1230,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb) ...@@ -1230,7 +1230,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb)
u64_stats_update_begin(&rxsc_stats->syncp); u64_stats_update_begin(&rxsc_stats->syncp);
rxsc_stats->stats.InPktsLate++; rxsc_stats->stats.InPktsLate++;
u64_stats_update_end(&rxsc_stats->syncp); u64_stats_update_end(&rxsc_stats->syncp);
macsec->secy.netdev->stats.rx_dropped++; DEV_STATS_INC(macsec->secy.netdev, rx_dropped);
goto drop; goto drop;
} }
} }
...@@ -1271,7 +1271,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb) ...@@ -1271,7 +1271,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb)
if (ret == NET_RX_SUCCESS) if (ret == NET_RX_SUCCESS)
count_rx(dev, len); count_rx(dev, len);
else else
macsec->secy.netdev->stats.rx_dropped++; DEV_STATS_INC(macsec->secy.netdev, rx_dropped);
rcu_read_unlock(); rcu_read_unlock();
...@@ -1308,7 +1308,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb) ...@@ -1308,7 +1308,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb)
u64_stats_update_begin(&secy_stats->syncp); u64_stats_update_begin(&secy_stats->syncp);
secy_stats->stats.InPktsNoSCI++; secy_stats->stats.InPktsNoSCI++;
u64_stats_update_end(&secy_stats->syncp); u64_stats_update_end(&secy_stats->syncp);
macsec->secy.netdev->stats.rx_errors++; DEV_STATS_INC(macsec->secy.netdev, rx_errors);
continue; continue;
} }
...@@ -1327,7 +1327,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb) ...@@ -1327,7 +1327,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb)
secy_stats->stats.InPktsUnknownSCI++; secy_stats->stats.InPktsUnknownSCI++;
u64_stats_update_end(&secy_stats->syncp); u64_stats_update_end(&secy_stats->syncp);
} else { } else {
macsec->secy.netdev->stats.rx_dropped++; DEV_STATS_INC(macsec->secy.netdev, rx_dropped);
} }
} }
...@@ -3422,7 +3422,7 @@ static netdev_tx_t macsec_start_xmit(struct sk_buff *skb, ...@@ -3422,7 +3422,7 @@ static netdev_tx_t macsec_start_xmit(struct sk_buff *skb,
if (!secy->operational) { if (!secy->operational) {
kfree_skb(skb); kfree_skb(skb);
dev->stats.tx_dropped++; DEV_STATS_INC(dev, tx_dropped);
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
...@@ -3430,7 +3430,7 @@ static netdev_tx_t macsec_start_xmit(struct sk_buff *skb, ...@@ -3430,7 +3430,7 @@ static netdev_tx_t macsec_start_xmit(struct sk_buff *skb,
skb = macsec_encrypt(skb, dev); skb = macsec_encrypt(skb, dev);
if (IS_ERR(skb)) { if (IS_ERR(skb)) {
if (PTR_ERR(skb) != -EINPROGRESS) if (PTR_ERR(skb) != -EINPROGRESS)
dev->stats.tx_dropped++; DEV_STATS_INC(dev, tx_dropped);
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
...@@ -3667,9 +3667,9 @@ static void macsec_get_stats64(struct net_device *dev, ...@@ -3667,9 +3667,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 = dev->stats.rx_dropped; s->rx_dropped = atomic_long_read(&dev->stats.__rx_dropped);
s->tx_dropped = dev->stats.tx_dropped; s->tx_dropped = atomic_long_read(&dev->stats.__tx_dropped);
s->rx_errors = dev->stats.rx_errors; s->rx_errors = atomic_long_read(&dev->stats.__rx_errors);
} }
static int macsec_get_iflink(const struct net_device *dev) static int macsec_get_iflink(const struct net_device *dev)
......
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