net: mlx4: Add support for XDP_REDIRECT

Started by Joshua Roys on Sep 23, 2021 · 10 messages from 3 authors · Last reply Sep 30, 2021

Subsystems (4)

Show 1 more

Maintainers (7)

Show 3 more
STALE1866d

open the first message on its own page

  1. [PATCH net-next] net: mlx4: Add XDP_REDIRECT statistics
    Related patches
  2. [PATCH net-next v2] net/mlx4_en: Add XDP_REDIRECT statistics
    Related patches
  3. [PATCH net-next v3] net/mlx4_en: Add XDP_REDIRECT statistics
    Related patches
Message details and related content
Signed-off-by: Joshua Roys <redacted>
---
 drivers/net/ethernet/mellanox/mlx4/en_rx.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

This is a pattern-match commit, based off of the mlx4 XDP_TX and other
drivers' XDP_REDIRECT enablement patches. The goal was to get AF_XDP
working in VPP and this was successful. Tested with a CX3.
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
index 7f6d3b82c29b..557d7daac2d3 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
@@ -669,6 +669,7 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
 	struct bpf_prog *xdp_prog;
 	int cq_ring = cq->ring;
 	bool doorbell_pending;
+	bool xdp_redir_flush;
 	struct mlx4_cqe *cqe;
 	struct xdp_buff xdp;
 	int polled = 0;
@@ -682,6 +683,7 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
 	xdp_prog = rcu_dereference_bh(ring->xdp_prog);
 	xdp_init_buff(&xdp, priv->frag_info[0].frag_stride, &ring->xdp_rxq);
 	doorbell_pending = false;
+	xdp_redir_flush = false;
 
 	/* We assume a 1:1 mapping between CQEs and Rx descriptors, so Rx
 	 * descriptor offset can be deduced from the CQE index instead of
@@ -790,6 +792,14 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
 			switch (act) {
 			case XDP_PASS:
 				break;
+			case XDP_REDIRECT:
+				if (xdp_do_redirect(dev, &xdp, xdp_prog) >= 0) {
+					xdp_redir_flush = true;
+					frags[0].page = NULL;
+					goto next;
+				}
+				trace_xdp_exception(dev, xdp_prog, act);
+				goto xdp_drop_no_cnt;
 			case XDP_TX:
 				if (likely(!mlx4_en_xmit_frame(ring, frags, priv,
 							length, cq_ring,
@@ -897,6 +907,9 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
 			break;
 	}
 
+	if (xdp_redir_flush)
+		xdp_do_flush();
+
 	if (likely(polled)) {
 		if (doorbell_pending) {
 			priv->tx_cq[TX_XDP][cq_ring]->xdp_busy = true;
-- 
2.31.1
Message details and related content
Adding requested maintainers to CC.

On Thu, Sep 23, 2021 at 12:11 PM Joshua Roys [off-list ref] wrote:
quoted hunk
Signed-off-by: Joshua Roys <redacted>
---
 drivers/net/ethernet/mellanox/mlx4/en_rx.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

This is a pattern-match commit, based off of the mlx4 XDP_TX and other
drivers' XDP_REDIRECT enablement patches. The goal was to get AF_XDP
working in VPP and this was successful. Tested with a CX3.
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
index 7f6d3b82c29b..557d7daac2d3 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
@@ -669,6 +669,7 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
        struct bpf_prog *xdp_prog;
        int cq_ring = cq->ring;
        bool doorbell_pending;
+       bool xdp_redir_flush;
        struct mlx4_cqe *cqe;
        struct xdp_buff xdp;
        int polled = 0;
@@ -682,6 +683,7 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
        xdp_prog = rcu_dereference_bh(ring->xdp_prog);
        xdp_init_buff(&xdp, priv->frag_info[0].frag_stride, &ring->xdp_rxq);
        doorbell_pending = false;
+       xdp_redir_flush = false;

        /* We assume a 1:1 mapping between CQEs and Rx descriptors, so Rx
         * descriptor offset can be deduced from the CQE index instead of
@@ -790,6 +792,14 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
                        switch (act) {
                        case XDP_PASS:
                                break;
+                       case XDP_REDIRECT:
+                               if (xdp_do_redirect(dev, &xdp, xdp_prog) >= 0) {
+                                       xdp_redir_flush = true;
+                                       frags[0].page = NULL;
+                                       goto next;
+                               }

18 more quoted lines

Message details and related content
Hello:

This patch was applied to netdev/net-next.git (refs/heads/master):

On Thu, 23 Sep 2021 12:10:34 -0400 you wrote:
Signed-off-by: Joshua Roys <redacted>
---
 drivers/net/ethernet/mellanox/mlx4/en_rx.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

This is a pattern-match commit, based off of the mlx4 XDP_TX and other
drivers' XDP_REDIRECT enablement patches. The goal was to get AF_XDP
working in VPP and this was successful. Tested with a CX3.
Here is the summary with links:
  - [net-next] net: mlx4: Add support for XDP_REDIRECT
    https://git.kernel.org/netdev/net-next/c/a8551c9b755e

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html

Message details and related content
Hi,

Thanks for your patch.
It was submitted and accepted during the weekend, in our off-hours (we work Sunday - Thursday).
Please check my comments below.

On 9/23/2021 7:10 PM, Joshua Roys wrote:

Empty commit message? No feature description, motivation, performance numbers, etc... That's bad.
Signed-off-by: Joshua Roys <redacted>
---
  drivers/net/ethernet/mellanox/mlx4/en_rx.c | 13 +++++++++++++
  1 file changed, 13 insertions(+)

This is a pattern-match commit, based off of the mlx4 XDP_TX and other
drivers' XDP_REDIRECT enablement patches. The goal was to get AF_XDP
working in VPP and this was successful. Tested with a CX3.
Your comment here doesn't get into the git commit log. It can't replace the patch description above.
quoted hunk
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
index 7f6d3b82c29b..557d7daac2d3 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
@@ -669,6 +669,7 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
  	struct bpf_prog *xdp_prog;
  	int cq_ring = cq->ring;
  	bool doorbell_pending;
+	bool xdp_redir_flush;
  	struct mlx4_cqe *cqe;
  	struct xdp_buff xdp;
  	int polled = 0;
@@ -682,6 +683,7 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
  	xdp_prog = rcu_dereference_bh(ring->xdp_prog);
  	xdp_init_buff(&xdp, priv->frag_info[0].frag_stride, &ring->xdp_rxq);
  	doorbell_pending = false;
+	xdp_redir_flush = false;
  
  	/* We assume a 1:1 mapping between CQEs and Rx descriptors, so Rx
  	 * descriptor offset can be deduced from the CQE index instead of
@@ -790,6 +792,14 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
  			switch (act) {
  			case XDP_PASS:
  				break;
+			case XDP_REDIRECT:
+				if (xdp_do_redirect(dev, &xdp, xdp_prog) >= 0) {
xdp_do_redirect returns a negative error code, or zero on success.
The >= 0 comparison looks strange and doesn't fit to the code style.
Simply use: "if (xdp_do_redirect(...))"

quoted hunk
+					xdp_redir_flush = true;
+					frags[0].page = NULL;
+					goto next;
+				}
+				trace_xdp_exception(dev, xdp_prog, act);
+				goto xdp_drop_no_cnt;
You didn't add the required stats to count packets going through the new xdp_redirect flow. Every incoming packet *MUST* increase some counter. Please add it.
quoted hunk
  			case XDP_TX:
  				if (likely(!mlx4_en_xmit_frame(ring, frags, priv,
  							length, cq_ring,
@@ -897,6 +907,9 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
  			break;
  	}
  
+	if (xdp_redir_flush)
+		xdp_do_flush();
+
  	if (likely(polled)) {
  		if (doorbell_pending) {
  			priv->tx_cq[TX_XDP][cq_ring]->xdp_busy = true;
Thanks,
Tariq

[PATCH net-next] net: mlx4: Add XDP_REDIRECT statistics

Message details and related content
Address feedback for XDP_REDIRECT patch.

Signed-off-by: Joshua Roys <redacted>
---
 .../net/ethernet/mellanox/mlx4/en_ethtool.c    |  8 ++++++++
 drivers/net/ethernet/mellanox/mlx4/en_port.c   | 18 +++++++++++-------
 drivers/net/ethernet/mellanox/mlx4/en_rx.c     |  4 +++-
 drivers/net/ethernet/mellanox/mlx4/mlx4_en.h   |  2 ++
 .../net/ethernet/mellanox/mlx4/mlx4_stats.h    |  4 +++-
 5 files changed, 27 insertions(+), 9 deletions(-)

Tested with VPP 21.06 on Fedora 34.
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
index ef518b1040f7..66c8ae29bc7a 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
@@ -197,6 +197,8 @@ static const char main_strings[][ETH_GSTRING_LEN] = {
 
 	/* xdp statistics */
 	"rx_xdp_drop",
+	"rx_xdp_redirect",
+	"rx_xdp_redirect_fail",
 	"rx_xdp_tx",
 	"rx_xdp_tx_full",
 
@@ -428,6 +430,8 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev,
 		data[index++] = priv->rx_ring[i]->bytes;
 		data[index++] = priv->rx_ring[i]->dropped;
 		data[index++] = priv->rx_ring[i]->xdp_drop;
+		data[index++] = priv->rx_ring[i]->xdp_redirect;
+		data[index++] = priv->rx_ring[i]->xdp_redirect_fail;
 		data[index++] = priv->rx_ring[i]->xdp_tx;
 		data[index++] = priv->rx_ring[i]->xdp_tx_full;
 	}
@@ -519,6 +523,10 @@ static void mlx4_en_get_strings(struct net_device *dev,
 				"rx%d_dropped", i);
 			sprintf(data + (index++) * ETH_GSTRING_LEN,
 				"rx%d_xdp_drop", i);
+			sprintf(data + (index++) * ETH_GSTRING_LEN,
+				"rx%d_xdp_redirect", i);
+			sprintf(data + (index++) * ETH_GSTRING_LEN,
+				"rx%d_xdp_redirect_fail", i);
 			sprintf(data + (index++) * ETH_GSTRING_LEN,
 				"rx%d_xdp_tx", i);
 			sprintf(data + (index++) * ETH_GSTRING_LEN,
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_port.c b/drivers/net/ethernet/mellanox/mlx4/en_port.c
index 0158b88bea5b..043cc9d75b3e 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_port.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_port.c
@@ -239,13 +239,15 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset)
 
 	mlx4_en_fold_software_stats(dev);
 
-	priv->port_stats.rx_chksum_good = 0;
-	priv->port_stats.rx_chksum_none = 0;
-	priv->port_stats.rx_chksum_complete = 0;
-	priv->port_stats.rx_alloc_pages = 0;
-	priv->xdp_stats.rx_xdp_drop    = 0;
-	priv->xdp_stats.rx_xdp_tx      = 0;
-	priv->xdp_stats.rx_xdp_tx_full = 0;
+	priv->port_stats.rx_chksum_good      = 0;
+	priv->port_stats.rx_chksum_none      = 0;
+	priv->port_stats.rx_chksum_complete  = 0;
+	priv->port_stats.rx_alloc_pages      = 0;
+	priv->xdp_stats.rx_xdp_drop          = 0;
+	priv->xdp_stats.rx_xdp_redirect      = 0;
+	priv->xdp_stats.rx_xdp_redirect_fail = 0;
+	priv->xdp_stats.rx_xdp_tx            = 0;
+	priv->xdp_stats.rx_xdp_tx_full       = 0;
 	for (i = 0; i < priv->rx_ring_num; i++) {
 		const struct mlx4_en_rx_ring *ring = priv->rx_ring[i];
 
@@ -255,6 +257,8 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset)
 		priv->port_stats.rx_chksum_complete += READ_ONCE(ring->csum_complete);
 		priv->port_stats.rx_alloc_pages += READ_ONCE(ring->rx_alloc_pages);
 		priv->xdp_stats.rx_xdp_drop	+= READ_ONCE(ring->xdp_drop);
+		priv->xdp_stats.rx_xdp_redirect += READ_ONCE(ring->xdp_redirect);
+		priv->xdp_stats.rx_xdp_redirect_fail += READ_ONCE(ring->xdp_redirect_fail);
 		priv->xdp_stats.rx_xdp_tx	+= READ_ONCE(ring->xdp_tx);
 		priv->xdp_stats.rx_xdp_tx_full	+= READ_ONCE(ring->xdp_tx_full);
 	}
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
index 557d7daac2d3..8f09b1de4125 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
@@ -793,11 +793,13 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
 			case XDP_PASS:
 				break;
 			case XDP_REDIRECT:
-				if (xdp_do_redirect(dev, &xdp, xdp_prog) >= 0) {
+				if (!xdp_do_redirect(dev, &xdp, xdp_prog)) {
+					ring->xdp_redirect++;
 					xdp_redir_flush = true;
 					frags[0].page = NULL;
 					goto next;
 				}
+				ring->xdp_redirect_fail++;
 				trace_xdp_exception(dev, xdp_prog, act);
 				goto xdp_drop_no_cnt;
 			case XDP_TX:
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
index f3d1a20201ef..f6c90e97b4cd 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
@@ -340,6 +340,8 @@ struct mlx4_en_rx_ring {
 	unsigned long csum_complete;
 	unsigned long rx_alloc_pages;
 	unsigned long xdp_drop;
+	unsigned long xdp_redirect;
+	unsigned long xdp_redirect_fail;
 	unsigned long xdp_tx;
 	unsigned long xdp_tx_full;
 	unsigned long dropped;
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h
index 7b51ae8cf759..e9cd4bb6f83d 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h
@@ -42,9 +42,11 @@ struct mlx4_en_port_stats {
 
 struct mlx4_en_xdp_stats {
 	unsigned long rx_xdp_drop;
+	unsigned long rx_xdp_redirect;
+	unsigned long rx_xdp_redirect_fail;
 	unsigned long rx_xdp_tx;
 	unsigned long rx_xdp_tx_full;
-#define NUM_XDP_STATS		3
+#define NUM_XDP_STATS		5
 };
 
 struct mlx4_en_phy_stats {
-- 
2.31.1

Re: [PATCH net-next] net: mlx4: Add XDP_REDIRECT statistics

Message details and related content
For changes in the mlx4 ethernet driver, please use "net/mlx4_en" prefix in patch subject.

On 9/28/2021 4:26 PM, Joshua Roys wrote:
Address feedback for XDP_REDIRECT patch.
Description is not helpful at all.
Please provide technical description of the content, motivation, why it is needed, etc...
quoted hunk
Signed-off-by: Joshua Roys <redacted>
---
  .../net/ethernet/mellanox/mlx4/en_ethtool.c    |  8 ++++++++
  drivers/net/ethernet/mellanox/mlx4/en_port.c   | 18 +++++++++++-------
  drivers/net/ethernet/mellanox/mlx4/en_rx.c     |  4 +++-
  drivers/net/ethernet/mellanox/mlx4/mlx4_en.h   |  2 ++
  .../net/ethernet/mellanox/mlx4/mlx4_stats.h    |  4 +++-
  5 files changed, 27 insertions(+), 9 deletions(-)

Tested with VPP 21.06 on Fedora 34.
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
index ef518b1040f7..66c8ae29bc7a 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
@@ -197,6 +197,8 @@ static const char main_strings[][ETH_GSTRING_LEN] = {
  
  	/* xdp statistics */
  	"rx_xdp_drop",
+	"rx_xdp_redirect",
+	"rx_xdp_redirect_fail",
  	"rx_xdp_tx",
  	"rx_xdp_tx_full",
  
@@ -428,6 +430,8 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev,
  		data[index++] = priv->rx_ring[i]->bytes;
  		data[index++] = priv->rx_ring[i]->dropped;
  		data[index++] = priv->rx_ring[i]->xdp_drop;
+		data[index++] = priv->rx_ring[i]->xdp_redirect;
+		data[index++] = priv->rx_ring[i]->xdp_redirect_fail;
  		data[index++] = priv->rx_ring[i]->xdp_tx;
  		data[index++] = priv->rx_ring[i]->xdp_tx_full;
  	}
@@ -519,6 +523,10 @@ static void mlx4_en_get_strings(struct net_device *dev,
  				"rx%d_dropped", i);
  			sprintf(data + (index++) * ETH_GSTRING_LEN,
  				"rx%d_xdp_drop", i);
+			sprintf(data + (index++) * ETH_GSTRING_LEN,
+				"rx%d_xdp_redirect", i);
+			sprintf(data + (index++) * ETH_GSTRING_LEN,

28 more quoted lines

No need to touch existing lines.
Add yours without fixing the existing indintations.
quoted hunk
  	for (i = 0; i < priv->rx_ring_num; i++) {
  		const struct mlx4_en_rx_ring *ring = priv->rx_ring[i];
  
@@ -255,6 +257,8 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset)
  		priv->port_stats.rx_chksum_complete += READ_ONCE(ring->csum_complete);
  		priv->port_stats.rx_alloc_pages += READ_ONCE(ring->rx_alloc_pages);
  		priv->xdp_stats.rx_xdp_drop	+= READ_ONCE(ring->xdp_drop);
+		priv->xdp_stats.rx_xdp_redirect += READ_ONCE(ring->xdp_redirect);
+		priv->xdp_stats.rx_xdp_redirect_fail += READ_ONCE(ring->xdp_redirect_fail);
  		priv->xdp_stats.rx_xdp_tx	+= READ_ONCE(ring->xdp_tx);
  		priv->xdp_stats.rx_xdp_tx_full	+= READ_ONCE(ring->xdp_tx_full);
  	}
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
index 557d7daac2d3..8f09b1de4125 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
@@ -793,11 +793,13 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
  			case XDP_PASS:
  				break;
  			case XDP_REDIRECT:
-				if (xdp_do_redirect(dev, &xdp, xdp_prog) >= 0) {
+				if (!xdp_do_redirect(dev, &xdp, xdp_prog)) {
use likely()
quoted hunk
+					ring->xdp_redirect++;
  					xdp_redir_flush = true;
  					frags[0].page = NULL;
  					goto next;
  				}
+				ring->xdp_redirect_fail++;
  				trace_xdp_exception(dev, xdp_prog, act);
  				goto xdp_drop_no_cnt;
  			case XDP_TX:
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
index f3d1a20201ef..f6c90e97b4cd 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
@@ -340,6 +340,8 @@ struct mlx4_en_rx_ring {
  	unsigned long csum_complete;
  	unsigned long rx_alloc_pages;
  	unsigned long xdp_drop;
+	unsigned long xdp_redirect;
+	unsigned long xdp_redirect_fail;
  	unsigned long xdp_tx;
  	unsigned long xdp_tx_full;
  	unsigned long dropped;
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h
index 7b51ae8cf759..e9cd4bb6f83d 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h
@@ -42,9 +42,11 @@ struct mlx4_en_port_stats {
  
  struct mlx4_en_xdp_stats {
  	unsigned long rx_xdp_drop;
+	unsigned long rx_xdp_redirect;
+	unsigned long rx_xdp_redirect_fail;
  	unsigned long rx_xdp_tx;
  	unsigned long rx_xdp_tx_full;
-#define NUM_XDP_STATS		3
+#define NUM_XDP_STATS		5
  };
  
  struct mlx4_en_phy_stats {

[PATCH net-next v2] net/mlx4_en: Add XDP_REDIRECT statistics

Message details and related content
Add counters for XDP REDIRECT success and failure. This brings the
redirect path in line with metrics gathered via the other XDP paths.

Signed-off-by: Joshua Roys <redacted>
---
 drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 8 ++++++++
 drivers/net/ethernet/mellanox/mlx4/en_port.c    | 4 ++++
 drivers/net/ethernet/mellanox/mlx4/en_rx.c      | 4 +++-
 drivers/net/ethernet/mellanox/mlx4/mlx4_en.h    | 2 ++
 drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h | 4 +++-
 5 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
index ef518b1040f7..66c8ae29bc7a 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
@@ -197,6 +197,8 @@ static const char main_strings[][ETH_GSTRING_LEN] = {
 
 	/* xdp statistics */
 	"rx_xdp_drop",
+	"rx_xdp_redirect",
+	"rx_xdp_redirect_fail",
 	"rx_xdp_tx",
 	"rx_xdp_tx_full",
 
@@ -428,6 +430,8 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev,
 		data[index++] = priv->rx_ring[i]->bytes;
 		data[index++] = priv->rx_ring[i]->dropped;
 		data[index++] = priv->rx_ring[i]->xdp_drop;
+		data[index++] = priv->rx_ring[i]->xdp_redirect;
+		data[index++] = priv->rx_ring[i]->xdp_redirect_fail;
 		data[index++] = priv->rx_ring[i]->xdp_tx;
 		data[index++] = priv->rx_ring[i]->xdp_tx_full;
 	}
@@ -519,6 +523,10 @@ static void mlx4_en_get_strings(struct net_device *dev,
 				"rx%d_dropped", i);
 			sprintf(data + (index++) * ETH_GSTRING_LEN,
 				"rx%d_xdp_drop", i);
+			sprintf(data + (index++) * ETH_GSTRING_LEN,
+				"rx%d_xdp_redirect", i);
+			sprintf(data + (index++) * ETH_GSTRING_LEN,
+				"rx%d_xdp_redirect_fail", i);
 			sprintf(data + (index++) * ETH_GSTRING_LEN,
 				"rx%d_xdp_tx", i);
 			sprintf(data + (index++) * ETH_GSTRING_LEN,
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_port.c b/drivers/net/ethernet/mellanox/mlx4/en_port.c
index 0158b88bea5b..f25794a92241 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_port.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_port.c
@@ -244,6 +244,8 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset)
 	priv->port_stats.rx_chksum_complete = 0;
 	priv->port_stats.rx_alloc_pages = 0;
 	priv->xdp_stats.rx_xdp_drop    = 0;
+	priv->xdp_stats.rx_xdp_redirect = 0;
+	priv->xdp_stats.rx_xdp_redirect_full = 0;
 	priv->xdp_stats.rx_xdp_tx      = 0;
 	priv->xdp_stats.rx_xdp_tx_full = 0;
 	for (i = 0; i < priv->rx_ring_num; i++) {
@@ -255,6 +257,8 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset)
 		priv->port_stats.rx_chksum_complete += READ_ONCE(ring->csum_complete);
 		priv->port_stats.rx_alloc_pages += READ_ONCE(ring->rx_alloc_pages);
 		priv->xdp_stats.rx_xdp_drop	+= READ_ONCE(ring->xdp_drop);
+		priv->xdp_stats.rx_xdp_redirect += READ_ONCE(ring->xdp_redirect);
+		priv->xdp_stats.rx_xdp_redirect_fail += READ_ONCE(ring->xdp_redirect_fail);
 		priv->xdp_stats.rx_xdp_tx	+= READ_ONCE(ring->xdp_tx);
 		priv->xdp_stats.rx_xdp_tx_full	+= READ_ONCE(ring->xdp_tx_full);
 	}
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
index 557d7daac2d3..650e6a1844ae 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
@@ -793,11 +793,13 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
 			case XDP_PASS:
 				break;
 			case XDP_REDIRECT:
-				if (xdp_do_redirect(dev, &xdp, xdp_prog) >= 0) {
+				if (likely(!xdp_do_redirect(dev, &xdp, xdp_prog))) {
+					ring->xdp_redirect++;
 					xdp_redir_flush = true;
 					frags[0].page = NULL;
 					goto next;
 				}
+				ring->xdp_redirect_fail++;
 				trace_xdp_exception(dev, xdp_prog, act);
 				goto xdp_drop_no_cnt;
 			case XDP_TX:
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
index f3d1a20201ef..f6c90e97b4cd 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
@@ -340,6 +340,8 @@ struct mlx4_en_rx_ring {
 	unsigned long csum_complete;
 	unsigned long rx_alloc_pages;
 	unsigned long xdp_drop;
+	unsigned long xdp_redirect;
+	unsigned long xdp_redirect_fail;
 	unsigned long xdp_tx;
 	unsigned long xdp_tx_full;
 	unsigned long dropped;
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h
index 7b51ae8cf759..e9cd4bb6f83d 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h
@@ -42,9 +42,11 @@ struct mlx4_en_port_stats {
 
 struct mlx4_en_xdp_stats {
 	unsigned long rx_xdp_drop;
+	unsigned long rx_xdp_redirect;
+	unsigned long rx_xdp_redirect_fail;
 	unsigned long rx_xdp_tx;
 	unsigned long rx_xdp_tx_full;
-#define NUM_XDP_STATS		3
+#define NUM_XDP_STATS		5
 };
 
 struct mlx4_en_phy_stats {
-- 
2.31.1

[PATCH net-next v3] net/mlx4_en: Add XDP_REDIRECT statistics

Message details and related content
Add counters for XDP REDIRECT success and failure. This brings the
redirect path in line with metrics gathered via the other XDP paths.

Signed-off-by: Joshua Roys <redacted>
---
 drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 8 ++++++++
 drivers/net/ethernet/mellanox/mlx4/en_port.c    | 4 ++++
 drivers/net/ethernet/mellanox/mlx4/en_rx.c      | 4 +++-
 drivers/net/ethernet/mellanox/mlx4/mlx4_en.h    | 2 ++
 drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h | 4 +++-
 5 files changed, 20 insertions(+), 2 deletions(-)

Sorry, this version fixes the full/fail typo.
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
index ef518b1040f7..66c8ae29bc7a 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
@@ -197,6 +197,8 @@ static const char main_strings[][ETH_GSTRING_LEN] = {
 
 	/* xdp statistics */
 	"rx_xdp_drop",
+	"rx_xdp_redirect",
+	"rx_xdp_redirect_fail",
 	"rx_xdp_tx",
 	"rx_xdp_tx_full",
 
@@ -428,6 +430,8 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev,
 		data[index++] = priv->rx_ring[i]->bytes;
 		data[index++] = priv->rx_ring[i]->dropped;
 		data[index++] = priv->rx_ring[i]->xdp_drop;
+		data[index++] = priv->rx_ring[i]->xdp_redirect;
+		data[index++] = priv->rx_ring[i]->xdp_redirect_fail;
 		data[index++] = priv->rx_ring[i]->xdp_tx;
 		data[index++] = priv->rx_ring[i]->xdp_tx_full;
 	}
@@ -519,6 +523,10 @@ static void mlx4_en_get_strings(struct net_device *dev,
 				"rx%d_dropped", i);
 			sprintf(data + (index++) * ETH_GSTRING_LEN,
 				"rx%d_xdp_drop", i);
+			sprintf(data + (index++) * ETH_GSTRING_LEN,
+				"rx%d_xdp_redirect", i);
+			sprintf(data + (index++) * ETH_GSTRING_LEN,
+				"rx%d_xdp_redirect_fail", i);
 			sprintf(data + (index++) * ETH_GSTRING_LEN,
 				"rx%d_xdp_tx", i);
 			sprintf(data + (index++) * ETH_GSTRING_LEN,
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_port.c b/drivers/net/ethernet/mellanox/mlx4/en_port.c
index 0158b88bea5b..f25794a92241 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_port.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_port.c
@@ -244,6 +244,8 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset)
 	priv->port_stats.rx_chksum_complete = 0;
 	priv->port_stats.rx_alloc_pages = 0;
 	priv->xdp_stats.rx_xdp_drop    = 0;
+	priv->xdp_stats.rx_xdp_redirect = 0;
+	priv->xdp_stats.rx_xdp_redirect_fail = 0;
 	priv->xdp_stats.rx_xdp_tx      = 0;
 	priv->xdp_stats.rx_xdp_tx_full = 0;
 	for (i = 0; i < priv->rx_ring_num; i++) {
@@ -255,6 +257,8 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset)
 		priv->port_stats.rx_chksum_complete += READ_ONCE(ring->csum_complete);
 		priv->port_stats.rx_alloc_pages += READ_ONCE(ring->rx_alloc_pages);
 		priv->xdp_stats.rx_xdp_drop	+= READ_ONCE(ring->xdp_drop);
+		priv->xdp_stats.rx_xdp_redirect += READ_ONCE(ring->xdp_redirect);
+		priv->xdp_stats.rx_xdp_redirect_fail += READ_ONCE(ring->xdp_redirect_fail);
 		priv->xdp_stats.rx_xdp_tx	+= READ_ONCE(ring->xdp_tx);
 		priv->xdp_stats.rx_xdp_tx_full	+= READ_ONCE(ring->xdp_tx_full);
 	}
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
index 557d7daac2d3..650e6a1844ae 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
@@ -793,11 +793,13 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
 			case XDP_PASS:
 				break;
 			case XDP_REDIRECT:
-				if (xdp_do_redirect(dev, &xdp, xdp_prog) >= 0) {
+				if (likely(!xdp_do_redirect(dev, &xdp, xdp_prog))) {
+					ring->xdp_redirect++;
 					xdp_redir_flush = true;
 					frags[0].page = NULL;
 					goto next;
 				}
+				ring->xdp_redirect_fail++;
 				trace_xdp_exception(dev, xdp_prog, act);
 				goto xdp_drop_no_cnt;
 			case XDP_TX:
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
index f3d1a20201ef..f6c90e97b4cd 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
@@ -340,6 +340,8 @@ struct mlx4_en_rx_ring {
 	unsigned long csum_complete;
 	unsigned long rx_alloc_pages;
 	unsigned long xdp_drop;
+	unsigned long xdp_redirect;
+	unsigned long xdp_redirect_fail;
 	unsigned long xdp_tx;
 	unsigned long xdp_tx_full;
 	unsigned long dropped;
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h
index 7b51ae8cf759..e9cd4bb6f83d 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h
@@ -42,9 +42,11 @@ struct mlx4_en_port_stats {
 
 struct mlx4_en_xdp_stats {
 	unsigned long rx_xdp_drop;
+	unsigned long rx_xdp_redirect;
+	unsigned long rx_xdp_redirect_fail;
 	unsigned long rx_xdp_tx;
 	unsigned long rx_xdp_tx_full;
-#define NUM_XDP_STATS		3
+#define NUM_XDP_STATS		5
 };
 
 struct mlx4_en_phy_stats {
-- 
2.31.1

Re: [PATCH net-next v3] net/mlx4_en: Add XDP_REDIRECT statistics

Message details and related content

On 9/30/2021 5:30 AM, Joshua Roys wrote:
quoted hunk
Add counters for XDP REDIRECT success and failure. This brings the
redirect path in line with metrics gathered via the other XDP paths.

Signed-off-by: Joshua Roys <redacted>
---
  drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 8 ++++++++
  drivers/net/ethernet/mellanox/mlx4/en_port.c    | 4 ++++
  drivers/net/ethernet/mellanox/mlx4/en_rx.c      | 4 +++-
  drivers/net/ethernet/mellanox/mlx4/mlx4_en.h    | 2 ++
  drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h | 4 +++-
  5 files changed, 20 insertions(+), 2 deletions(-)

Sorry, this version fixes the full/fail typo.
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
index ef518b1040f7..66c8ae29bc7a 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
@@ -197,6 +197,8 @@ static const char main_strings[][ETH_GSTRING_LEN] = {
  
  	/* xdp statistics */
  	"rx_xdp_drop",
+	"rx_xdp_redirect",
+	"rx_xdp_redirect_fail",
  	"rx_xdp_tx",
  	"rx_xdp_tx_full",
  
@@ -428,6 +430,8 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev,
  		data[index++] = priv->rx_ring[i]->bytes;
  		data[index++] = priv->rx_ring[i]->dropped;
  		data[index++] = priv->rx_ring[i]->xdp_drop;
+		data[index++] = priv->rx_ring[i]->xdp_redirect;
+		data[index++] = priv->rx_ring[i]->xdp_redirect_fail;
  		data[index++] = priv->rx_ring[i]->xdp_tx;
  		data[index++] = priv->rx_ring[i]->xdp_tx_full;
  	}
@@ -519,6 +523,10 @@ static void mlx4_en_get_strings(struct net_device *dev,
  				"rx%d_dropped", i);
  			sprintf(data + (index++) * ETH_GSTRING_LEN,
  				"rx%d_xdp_drop", i);

79 more quoted lines

Thanks for your patch.
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>

Re: [PATCH net-next v3] net/mlx4_en: Add XDP_REDIRECT statistics

Message details and related content
Hello:

This patch was applied to netdev/net-next.git (refs/heads/master):

On Wed, 29 Sep 2021 22:30:23 -0400 you wrote:
Add counters for XDP REDIRECT success and failure. This brings the
redirect path in line with metrics gathered via the other XDP paths.

Signed-off-by: Joshua Roys <redacted>
---
 drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 8 ++++++++
 drivers/net/ethernet/mellanox/mlx4/en_port.c    | 4 ++++
 drivers/net/ethernet/mellanox/mlx4/en_rx.c      | 4 +++-
 drivers/net/ethernet/mellanox/mlx4/mlx4_en.h    | 2 ++
 drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h | 4 +++-
 5 files changed, 20 insertions(+), 2 deletions(-)

[...]
Here is the summary with links:
  - [net-next,v3] net/mlx4_en: Add XDP_REDIRECT statistics
    https://git.kernel.org/netdev/net-next/c/dee3b2d0fa4b

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html

Keyboard shortcuts
hback out one level
jnext message in thread / next series-diff position
kprevious message in thread / previous series-diff position
ldrill in
Escclose help / fold thread tree
?toggle this help