net: mvneta: move rx_dropped and rx_errors in per-cpu stats
Move rx_dropped and rx_errors counters in mvneta_pcpu_stats in order to avoid possible races updating statistics Fixes:562e2f467e
("net: mvneta: Improve the buffer allocation method for SWBM") Fixes:dc35a10f68
("net: mvneta: bm: add support for hardware buffer management") Fixes:c5aff18204
("net: mvneta: driver for Marvell Armada 370/XP network unit") Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
45a8317ed2
Коммит
c35947b8ff
|
@ -401,6 +401,8 @@ struct mvneta_pcpu_stats {
|
|||
struct u64_stats_sync syncp;
|
||||
u64 rx_packets;
|
||||
u64 rx_bytes;
|
||||
u64 rx_dropped;
|
||||
u64 rx_errors;
|
||||
u64 tx_packets;
|
||||
u64 tx_bytes;
|
||||
};
|
||||
|
@ -738,6 +740,8 @@ mvneta_get_stats64(struct net_device *dev,
|
|||
struct mvneta_pcpu_stats *cpu_stats;
|
||||
u64 rx_packets;
|
||||
u64 rx_bytes;
|
||||
u64 rx_dropped;
|
||||
u64 rx_errors;
|
||||
u64 tx_packets;
|
||||
u64 tx_bytes;
|
||||
|
||||
|
@ -746,19 +750,20 @@ mvneta_get_stats64(struct net_device *dev,
|
|||
start = u64_stats_fetch_begin_irq(&cpu_stats->syncp);
|
||||
rx_packets = cpu_stats->rx_packets;
|
||||
rx_bytes = cpu_stats->rx_bytes;
|
||||
rx_dropped = cpu_stats->rx_dropped;
|
||||
rx_errors = cpu_stats->rx_errors;
|
||||
tx_packets = cpu_stats->tx_packets;
|
||||
tx_bytes = cpu_stats->tx_bytes;
|
||||
} while (u64_stats_fetch_retry_irq(&cpu_stats->syncp, start));
|
||||
|
||||
stats->rx_packets += rx_packets;
|
||||
stats->rx_bytes += rx_bytes;
|
||||
stats->rx_dropped += rx_dropped;
|
||||
stats->rx_errors += rx_errors;
|
||||
stats->tx_packets += tx_packets;
|
||||
stats->tx_bytes += tx_bytes;
|
||||
}
|
||||
|
||||
stats->rx_errors = dev->stats.rx_errors;
|
||||
stats->rx_dropped = dev->stats.rx_dropped;
|
||||
|
||||
stats->tx_dropped = dev->stats.tx_dropped;
|
||||
}
|
||||
|
||||
|
@ -1736,8 +1741,14 @@ static u32 mvneta_txq_desc_csum(int l3_offs, int l3_proto,
|
|||
static void mvneta_rx_error(struct mvneta_port *pp,
|
||||
struct mvneta_rx_desc *rx_desc)
|
||||
{
|
||||
struct mvneta_pcpu_stats *stats = this_cpu_ptr(pp->stats);
|
||||
u32 status = rx_desc->status;
|
||||
|
||||
/* update per-cpu counter */
|
||||
u64_stats_update_begin(&stats->syncp);
|
||||
stats->rx_errors++;
|
||||
u64_stats_update_end(&stats->syncp);
|
||||
|
||||
switch (status & MVNETA_RXD_ERR_CODE_MASK) {
|
||||
case MVNETA_RXD_ERR_CRC:
|
||||
netdev_err(pp->dev, "bad rx status %08x (crc error), size=%d\n",
|
||||
|
@ -2179,11 +2190,15 @@ mvneta_swbm_rx_frame(struct mvneta_port *pp,
|
|||
|
||||
rxq->skb = build_skb(xdp->data_hard_start, PAGE_SIZE);
|
||||
if (unlikely(!rxq->skb)) {
|
||||
netdev_err(dev,
|
||||
"Can't allocate skb on queue %d\n",
|
||||
rxq->id);
|
||||
dev->stats.rx_dropped++;
|
||||
struct mvneta_pcpu_stats *stats = this_cpu_ptr(pp->stats);
|
||||
|
||||
netdev_err(dev, "Can't allocate skb on queue %d\n", rxq->id);
|
||||
rxq->skb_alloc_err++;
|
||||
|
||||
u64_stats_update_begin(&stats->syncp);
|
||||
stats->rx_dropped++;
|
||||
u64_stats_update_end(&stats->syncp);
|
||||
|
||||
return -ENOMEM;
|
||||
}
|
||||
page_pool_release_page(rxq->page_pool, page);
|
||||
|
@ -2270,7 +2285,6 @@ static int mvneta_rx_swbm(struct napi_struct *napi,
|
|||
/* Check errors only for FIRST descriptor */
|
||||
if (rx_status & MVNETA_RXD_ERR_SUMMARY) {
|
||||
mvneta_rx_error(pp, rx_desc);
|
||||
dev->stats.rx_errors++;
|
||||
/* leave the descriptor untouched */
|
||||
continue;
|
||||
}
|
||||
|
@ -2372,7 +2386,6 @@ err_drop_frame_ret_pool:
|
|||
mvneta_bm_pool_put_bp(pp->bm_priv, bm_pool,
|
||||
rx_desc->buf_phys_addr);
|
||||
err_drop_frame:
|
||||
dev->stats.rx_errors++;
|
||||
mvneta_rx_error(pp, rx_desc);
|
||||
/* leave the descriptor untouched */
|
||||
continue;
|
||||
|
|
Загрузка…
Ссылка в новой задаче