netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net 0/3] net: ethernet: ti: am65-cpsw: XDP fixes
@ 2025-02-10 14:52 Roger Quadros
  2025-02-10 14:52 ` [PATCH net 1/3] net: ethernet: ti: am65-cpsw: fix memleak in certain XDP cases Roger Quadros
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Roger Quadros @ 2025-02-10 14:52 UTC (permalink / raw)
  To: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, Alexei Starovoitov, Daniel Borkmann,
	Jesper Dangaard Brouer, John Fastabend, Julien Panis,
	Jacob Keller
  Cc: danishanwar, s-vadapalli, srk, netdev, linux-kernel, bpf,
	Roger Quadros

Hi,

This series fixes memleak and statistics for XDP cases.

cheers,
-roger

Signed-off-by: Roger Quadros <rogerq@kernel.org>
---
Roger Quadros (3):
      net: ethernet: ti: am65-cpsw: fix memleak in certain XDP cases
      net: ethernet: ti: am65-cpsw: fix RX & TX statistics for XDP_TX case
      net: ethernet: ti: am65_cpsw: fix tx_cleanup for XDP case

 drivers/net/ethernet/ti/am65-cpsw-nuss.c | 50 +++++++++++++++++++-------------
 1 file changed, 30 insertions(+), 20 deletions(-)
---
base-commit: 2014c95afecee3e76ca4a56956a936e23283f05b
change-id: 20250207-am65-cpsw-xdp-fixes-b86e356624af

Best regards,
-- 
Roger Quadros <rogerq@kernel.org>


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH net 1/3] net: ethernet: ti: am65-cpsw: fix memleak in certain XDP cases
  2025-02-10 14:52 [PATCH net 0/3] net: ethernet: ti: am65-cpsw: XDP fixes Roger Quadros
@ 2025-02-10 14:52 ` Roger Quadros
  2025-02-13  4:14   ` Jakub Kicinski
  2025-02-10 14:52 ` [PATCH net 2/3] net: ethernet: ti: am65-cpsw: fix RX & TX statistics for XDP_TX case Roger Quadros
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 7+ messages in thread
From: Roger Quadros @ 2025-02-10 14:52 UTC (permalink / raw)
  To: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, Alexei Starovoitov, Daniel Borkmann,
	Jesper Dangaard Brouer, John Fastabend, Julien Panis,
	Jacob Keller
  Cc: danishanwar, s-vadapalli, srk, netdev, linux-kernel, bpf,
	Roger Quadros

If the XDP program doesn't result in XDP_PASS then we leak the
memory allocated by am65_cpsw_build_skb().

It is pointless to allocate SKB memory before running the XDP
program as we would be wasting CPU cycles for cases other than XDP_PASS.
Move the SKB allocation after evaluating the XDP program result.

This fixes the memleak. A performance boost is seen for XDP_DROP test.

XDP_DROP test:
Before: 460256 rx/s                  0 err/s
After:  784130 rx/s                  0 err/s

Fixes: 8acacc40f733 ("net: ethernet: ti: am65-cpsw: Add minimal XDP support")
Signed-off-by: Roger Quadros <rogerq@kernel.org>
---
 drivers/net/ethernet/ti/am65-cpsw-nuss.c | 26 ++++++++++++--------------
 1 file changed, 12 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.c b/drivers/net/ethernet/ti/am65-cpsw-nuss.c
index b663271e79f7..e26c6dc02648 100644
--- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c
+++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c
@@ -842,7 +842,8 @@ static void am65_cpsw_nuss_tx_cleanup(void *data, dma_addr_t desc_dma)
 
 static struct sk_buff *am65_cpsw_build_skb(void *page_addr,
 					   struct net_device *ndev,
-					   unsigned int len)
+					   unsigned int len,
+					   unsigned int headroom)
 {
 	struct sk_buff *skb;
 
@@ -852,7 +853,7 @@ static struct sk_buff *am65_cpsw_build_skb(void *page_addr,
 	if (unlikely(!skb))
 		return NULL;
 
-	skb_reserve(skb, AM65_CPSW_HEADROOM);
+	skb_reserve(skb, headroom);
 	skb->dev = ndev;
 
 	return skb;
@@ -1277,7 +1278,7 @@ static int am65_cpsw_nuss_rx_packets(struct am65_cpsw_rx_flow *flow,
 	u32 flow_idx = flow->id;
 	struct sk_buff *skb;
 	struct xdp_buff	xdp;
-	int headroom, ret;
+	int headroom = AM65_CPSW_HEADROOM, ret;
 	void *page_addr;
 	u32 *psdata;
 
@@ -1315,16 +1316,8 @@ static int am65_cpsw_nuss_rx_packets(struct am65_cpsw_rx_flow *flow,
 	dev_dbg(dev, "%s rx csum_info:%#x\n", __func__, csum_info);
 
 	dma_unmap_single(rx_chn->dma_dev, buf_dma, buf_dma_len, DMA_FROM_DEVICE);
-
 	k3_cppi_desc_pool_free(rx_chn->desc_pool, desc_rx);
 
-	skb = am65_cpsw_build_skb(page_addr, ndev,
-				  AM65_CPSW_MAX_PACKET_SIZE);
-	if (unlikely(!skb)) {
-		new_page = page;
-		goto requeue;
-	}
-
 	if (port->xdp_prog) {
 		xdp_init_buff(&xdp, PAGE_SIZE, &port->xdp_rxq[flow->id]);
 		xdp_prepare_buff(&xdp, page_addr, AM65_CPSW_HEADROOM,
@@ -1334,9 +1327,14 @@ static int am65_cpsw_nuss_rx_packets(struct am65_cpsw_rx_flow *flow,
 		if (*xdp_state != AM65_CPSW_XDP_PASS)
 			goto allocate;
 
-		/* Compute additional headroom to be reserved */
-		headroom = (xdp.data - xdp.data_hard_start) - skb_headroom(skb);
-		skb_reserve(skb, headroom);
+		headroom = xdp.data - xdp.data_hard_start;
+	}
+
+	skb = am65_cpsw_build_skb(page_addr, ndev,
+				  AM65_CPSW_MAX_PACKET_SIZE, headroom);
+	if (unlikely(!skb)) {
+		new_page = page;
+		goto requeue;
 	}
 
 	ndev_priv = netdev_priv(ndev);

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH net 2/3] net: ethernet: ti: am65-cpsw: fix RX & TX statistics for XDP_TX case
  2025-02-10 14:52 [PATCH net 0/3] net: ethernet: ti: am65-cpsw: XDP fixes Roger Quadros
  2025-02-10 14:52 ` [PATCH net 1/3] net: ethernet: ti: am65-cpsw: fix memleak in certain XDP cases Roger Quadros
@ 2025-02-10 14:52 ` Roger Quadros
  2025-02-10 14:52 ` [PATCH net 3/3] net: ethernet: ti: am65_cpsw: fix tx_cleanup for XDP case Roger Quadros
  2025-02-13  4:20 ` [PATCH net 0/3] net: ethernet: ti: am65-cpsw: XDP fixes patchwork-bot+netdevbpf
  3 siblings, 0 replies; 7+ messages in thread
From: Roger Quadros @ 2025-02-10 14:52 UTC (permalink / raw)
  To: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, Alexei Starovoitov, Daniel Borkmann,
	Jesper Dangaard Brouer, John Fastabend, Julien Panis,
	Jacob Keller
  Cc: danishanwar, s-vadapalli, srk, netdev, linux-kernel, bpf,
	Roger Quadros

For successful XDP_TX and XDP_REDIRECT cases, the packet was received
successfully so update RX statistics. Use original received
packet length for that.

TX packets statistics are incremented on TX completion so don't
update it while TX queueing.

If xdp_convert_buff_to_frame() fails, increment tx_dropped.

Signed-off-by: Roger Quadros <rogerq@kernel.org>
Fixes: 8acacc40f733 ("net: ethernet: ti: am65-cpsw: Add minimal XDP support")
---
 drivers/net/ethernet/ti/am65-cpsw-nuss.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.c b/drivers/net/ethernet/ti/am65-cpsw-nuss.c
index e26c6dc02648..bee2d66b9ccf 100644
--- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c
+++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c
@@ -1170,9 +1170,11 @@ static int am65_cpsw_run_xdp(struct am65_cpsw_rx_flow *flow,
 	struct xdp_frame *xdpf;
 	struct bpf_prog *prog;
 	struct page *page;
+	int pkt_len;
 	u32 act;
 	int err;
 
+	pkt_len = *len;
 	prog = READ_ONCE(port->xdp_prog);
 	if (!prog)
 		return AM65_CPSW_XDP_PASS;
@@ -1190,8 +1192,10 @@ static int am65_cpsw_run_xdp(struct am65_cpsw_rx_flow *flow,
 		netif_txq = netdev_get_tx_queue(ndev, tx_chn->id);
 
 		xdpf = xdp_convert_buff_to_frame(xdp);
-		if (unlikely(!xdpf))
+		if (unlikely(!xdpf)) {
+			ndev->stats.tx_dropped++;
 			goto drop;
+		}
 
 		__netif_tx_lock(netif_txq, cpu);
 		err = am65_cpsw_xdp_tx_frame(ndev, tx_chn, xdpf,
@@ -1200,14 +1204,14 @@ static int am65_cpsw_run_xdp(struct am65_cpsw_rx_flow *flow,
 		if (err)
 			goto drop;
 
-		dev_sw_netstats_tx_add(ndev, 1, *len);
+		dev_sw_netstats_rx_add(ndev, pkt_len);
 		ret = AM65_CPSW_XDP_CONSUMED;
 		goto out;
 	case XDP_REDIRECT:
 		if (unlikely(xdp_do_redirect(ndev, xdp, prog)))
 			goto drop;
 
-		dev_sw_netstats_rx_add(ndev, *len);
+		dev_sw_netstats_rx_add(ndev, pkt_len);
 		ret = AM65_CPSW_XDP_REDIRECT;
 		goto out;
 	default:

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH net 3/3] net: ethernet: ti: am65_cpsw: fix tx_cleanup for XDP case
  2025-02-10 14:52 [PATCH net 0/3] net: ethernet: ti: am65-cpsw: XDP fixes Roger Quadros
  2025-02-10 14:52 ` [PATCH net 1/3] net: ethernet: ti: am65-cpsw: fix memleak in certain XDP cases Roger Quadros
  2025-02-10 14:52 ` [PATCH net 2/3] net: ethernet: ti: am65-cpsw: fix RX & TX statistics for XDP_TX case Roger Quadros
@ 2025-02-10 14:52 ` Roger Quadros
  2025-02-13  4:20 ` [PATCH net 0/3] net: ethernet: ti: am65-cpsw: XDP fixes patchwork-bot+netdevbpf
  3 siblings, 0 replies; 7+ messages in thread
From: Roger Quadros @ 2025-02-10 14:52 UTC (permalink / raw)
  To: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, Alexei Starovoitov, Daniel Borkmann,
	Jesper Dangaard Brouer, John Fastabend, Julien Panis,
	Jacob Keller
  Cc: danishanwar, s-vadapalli, srk, netdev, linux-kernel, bpf,
	Roger Quadros

For XDP transmit case, swdata doesn't contain SKB but the
XDP Frame. Infer the correct swdata based on buffer type
and return the XDP Frame for XDP transmit case.

Signed-off-by: Roger Quadros <rogerq@kernel.org>
Fixes: 8acacc40f733 ("net: ethernet: ti: am65-cpsw: Add minimal XDP support")
---
 drivers/net/ethernet/ti/am65-cpsw-nuss.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.c b/drivers/net/ethernet/ti/am65-cpsw-nuss.c
index bee2d66b9ccf..a2b6a30918f6 100644
--- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c
+++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c
@@ -828,16 +828,24 @@ static void am65_cpsw_nuss_xmit_free(struct am65_cpsw_tx_chn *tx_chn,
 static void am65_cpsw_nuss_tx_cleanup(void *data, dma_addr_t desc_dma)
 {
 	struct am65_cpsw_tx_chn *tx_chn = data;
+	enum am65_cpsw_tx_buf_type buf_type;
 	struct cppi5_host_desc_t *desc_tx;
+	struct xdp_frame *xdpf;
 	struct sk_buff *skb;
 	void **swdata;
 
 	desc_tx = k3_cppi_desc_pool_dma2virt(tx_chn->desc_pool, desc_dma);
 	swdata = cppi5_hdesc_get_swdata(desc_tx);
-	skb = *(swdata);
-	am65_cpsw_nuss_xmit_free(tx_chn, desc_tx);
+	buf_type = am65_cpsw_nuss_buf_type(tx_chn, desc_dma);
+	if (buf_type == AM65_CPSW_TX_BUF_TYPE_SKB) {
+		skb = *(swdata);
+		dev_kfree_skb_any(skb);
+	} else {
+		xdpf = *(swdata);
+		xdp_return_frame(xdpf);
+	}
 
-	dev_kfree_skb_any(skb);
+	am65_cpsw_nuss_xmit_free(tx_chn, desc_tx);
 }
 
 static struct sk_buff *am65_cpsw_build_skb(void *page_addr,

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH net 1/3] net: ethernet: ti: am65-cpsw: fix memleak in certain XDP cases
  2025-02-10 14:52 ` [PATCH net 1/3] net: ethernet: ti: am65-cpsw: fix memleak in certain XDP cases Roger Quadros
@ 2025-02-13  4:14   ` Jakub Kicinski
  2025-02-14 11:39     ` Roger Quadros
  0 siblings, 1 reply; 7+ messages in thread
From: Jakub Kicinski @ 2025-02-13  4:14 UTC (permalink / raw)
  To: Roger Quadros
  Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Paolo Abeni,
	Alexei Starovoitov, Daniel Borkmann, Jesper Dangaard Brouer,
	John Fastabend, Julien Panis, Jacob Keller, danishanwar,
	s-vadapalli, srk, netdev, linux-kernel, bpf

On Mon, 10 Feb 2025 16:52:15 +0200 Roger Quadros wrote:
> -		/* Compute additional headroom to be reserved */
> -		headroom = (xdp.data - xdp.data_hard_start) - skb_headroom(skb);
> -		skb_reserve(skb, headroom);
> +		headroom = xdp.data - xdp.data_hard_start;
> +	}

I'm gonna do a minor touch up here and set the headroom in "else" hope
you don't mind. Easier to read the code if the init isnt all the way up
at definition. Also that way reverse xmas tree is maintained.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH net 0/3] net: ethernet: ti: am65-cpsw: XDP fixes
  2025-02-10 14:52 [PATCH net 0/3] net: ethernet: ti: am65-cpsw: XDP fixes Roger Quadros
                   ` (2 preceding siblings ...)
  2025-02-10 14:52 ` [PATCH net 3/3] net: ethernet: ti: am65_cpsw: fix tx_cleanup for XDP case Roger Quadros
@ 2025-02-13  4:20 ` patchwork-bot+netdevbpf
  3 siblings, 0 replies; 7+ messages in thread
From: patchwork-bot+netdevbpf @ 2025-02-13  4:20 UTC (permalink / raw)
  To: Roger Quadros
  Cc: andrew+netdev, davem, edumazet, kuba, pabeni, ast, daniel, hawk,
	john.fastabend, jpanis, jacob.e.keller, danishanwar, s-vadapalli,
	srk, netdev, linux-kernel, bpf

Hello:

This series was applied to netdev/net.git (main)
by Jakub Kicinski <kuba@kernel.org>:

On Mon, 10 Feb 2025 16:52:14 +0200 you wrote:
> Hi,
> 
> This series fixes memleak and statistics for XDP cases.
> 
> cheers,
> -roger
> 
> [...]

Here is the summary with links:
  - [net,1/3] net: ethernet: ti: am65-cpsw: fix memleak in certain XDP cases
    (no matching commit)
  - [net,2/3] net: ethernet: ti: am65-cpsw: fix RX & TX statistics for XDP_TX case
    https://git.kernel.org/netdev/net/c/8a9f82ff15da
  - [net,3/3] net: ethernet: ti: am65_cpsw: fix tx_cleanup for XDP case
    https://git.kernel.org/netdev/net/c/4542536f664f

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



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH net 1/3] net: ethernet: ti: am65-cpsw: fix memleak in certain XDP cases
  2025-02-13  4:14   ` Jakub Kicinski
@ 2025-02-14 11:39     ` Roger Quadros
  0 siblings, 0 replies; 7+ messages in thread
From: Roger Quadros @ 2025-02-14 11:39 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Paolo Abeni,
	Alexei Starovoitov, Daniel Borkmann, Jesper Dangaard Brouer,
	John Fastabend, Julien Panis, Jacob Keller, danishanwar,
	s-vadapalli, srk, netdev, linux-kernel, bpf



On 13/02/2025 06:14, Jakub Kicinski wrote:
> On Mon, 10 Feb 2025 16:52:15 +0200 Roger Quadros wrote:
>> -		/* Compute additional headroom to be reserved */
>> -		headroom = (xdp.data - xdp.data_hard_start) - skb_headroom(skb);
>> -		skb_reserve(skb, headroom);
>> +		headroom = xdp.data - xdp.data_hard_start;
>> +	}
> 
> I'm gonna do a minor touch up here and set the headroom in "else" hope
> you don't mind. Easier to read the code if the init isnt all the way up
> at definition. Also that way reverse xmas tree is maintained.

Thank you for the touch up.

-- 
cheers,
-roger


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2025-02-14 11:39 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-10 14:52 [PATCH net 0/3] net: ethernet: ti: am65-cpsw: XDP fixes Roger Quadros
2025-02-10 14:52 ` [PATCH net 1/3] net: ethernet: ti: am65-cpsw: fix memleak in certain XDP cases Roger Quadros
2025-02-13  4:14   ` Jakub Kicinski
2025-02-14 11:39     ` Roger Quadros
2025-02-10 14:52 ` [PATCH net 2/3] net: ethernet: ti: am65-cpsw: fix RX & TX statistics for XDP_TX case Roger Quadros
2025-02-10 14:52 ` [PATCH net 3/3] net: ethernet: ti: am65_cpsw: fix tx_cleanup for XDP case Roger Quadros
2025-02-13  4:20 ` [PATCH net 0/3] net: ethernet: ti: am65-cpsw: XDP fixes patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).