* [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* 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 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
* [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 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