net: ethernet: ti: am65-cpsw: Fix RX statistics for XDP_TX and XDP_REDIRECT
authorRoger Quadros <rogerq@kernel.org>
Thu, 29 Aug 2024 12:03:21 +0000 (15:03 +0300)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 3 Sep 2024 08:43:46 +0000 (10:43 +0200)
We are not using ndev->stats for rx_packets and rx_bytes anymore.
Instead, we use per CPU stats which are collated in
am65_cpsw_nuss_ndo_get_stats().

Fix RX statistics for XDP_TX and XDP_REDIRECT cases.

Fixes: 8acacc40f733 ("net: ethernet: ti: am65-cpsw: Add minimal XDP support")
Signed-off-by: Roger Quadros <rogerq@kernel.org>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Acked-by: Julien Panis <jpanis@baylibre.com>
Reviewed-by: MD Danish Anwar <danishanwar@ti.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/ti/am65-cpsw-nuss.c

index 03577a008df2963561445854881490af6c8bcc44..b06b8872b4eb7f8f4807c5d054a1e88cef049324 100644 (file)
@@ -998,7 +998,9 @@ static int am65_cpsw_run_xdp(struct am65_cpsw_common *common,
                             int desc_idx, int cpu, int *len)
 {
        struct am65_cpsw_rx_chn *rx_chn = &common->rx_chns;
+       struct am65_cpsw_ndev_priv *ndev_priv;
        struct net_device *ndev = port->ndev;
+       struct am65_cpsw_ndev_stats *stats;
        int ret = AM65_CPSW_XDP_CONSUMED;
        struct am65_cpsw_tx_chn *tx_chn;
        struct netdev_queue *netif_txq;
@@ -1016,6 +1018,9 @@ static int am65_cpsw_run_xdp(struct am65_cpsw_common *common,
        /* XDP prog might have changed packet data and boundaries */
        *len = xdp->data_end - xdp->data;
 
+       ndev_priv = netdev_priv(ndev);
+       stats = this_cpu_ptr(ndev_priv->stats);
+
        switch (act) {
        case XDP_PASS:
                ret = AM65_CPSW_XDP_PASS;
@@ -1035,16 +1040,20 @@ static int am65_cpsw_run_xdp(struct am65_cpsw_common *common,
                if (err)
                        goto drop;
 
-               ndev->stats.rx_bytes += *len;
-               ndev->stats.rx_packets++;
+               u64_stats_update_begin(&stats->syncp);
+               stats->rx_bytes += *len;
+               stats->rx_packets++;
+               u64_stats_update_end(&stats->syncp);
                ret = AM65_CPSW_XDP_CONSUMED;
                goto out;
        case XDP_REDIRECT:
                if (unlikely(xdp_do_redirect(ndev, xdp, prog)))
                        goto drop;
 
-               ndev->stats.rx_bytes += *len;
-               ndev->stats.rx_packets++;
+               u64_stats_update_begin(&stats->syncp);
+               stats->rx_bytes += *len;
+               stats->rx_packets++;
+               u64_stats_update_end(&stats->syncp);
                ret = AM65_CPSW_XDP_REDIRECT;
                goto out;
        default: