macsec: use DEV_STATS_INC()
[ Upstream commit 32d0a49d36a2a306c2e47fe5659361e424f0ed3f ] 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: c09440f7dcb3 ("macsec: introduce IEEE 802.1AE driver") Reported-by: syzbot <syzkaller@googlegroups.com> Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Sabrina Dubroca <sd@queasysnail.net> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
ecf0e627fb
commit
e77ef78741
@ -765,7 +765,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -789,7 +789,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1075,7 +1075,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1185,7 +1185,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1202,7 +1202,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;
|
||||||
@ -1236,7 +1236,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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1277,7 +1277,7 @@ deliver:
|
|||||||
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();
|
||||||
|
|
||||||
@ -1314,7 +1314,7 @@ nosci:
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1333,7 +1333,7 @@ nosci:
|
|||||||
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3442,7 +3442,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3450,7 +3450,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3685,9 +3685,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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user