Commit 624d3291 authored by Roger Quadros's avatar Roger Quadros Committed by Paolo Abeni
Browse files

net: ethernet: ti: am65-cpsw: Fix RX statistics for XDP_TX and XDP_REDIRECT



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: 8acacc40 ("net: ethernet: ti: am65-cpsw: Add minimal XDP support")
Signed-off-by: default avatarRoger Quadros <rogerq@kernel.org>
Reviewed-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Acked-by: default avatarJulien Panis <jpanis@baylibre.com>
Reviewed-by: default avatarMD Danish Anwar <danishanwar@ti.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 0a50c352
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -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: