]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: ti: icssg-prueth: Fix packet handling for XDP_TX
authorMeghana Malladi <m-malladi@ti.com>
Mon, 16 Jun 2025 06:33:19 +0000 (12:03 +0530)
committerJakub Kicinski <kuba@kernel.org>
Tue, 17 Jun 2025 22:33:36 +0000 (15:33 -0700)
While transmitting XDP frames for XDP_TX, page_pool is
used to get the DMA buffers (already mapped to the pages)
and need to be freed/reycled once the transmission is complete.
This need not be explicitly done by the driver as this is handled
more gracefully by the xdp driver while returning the xdp frame.
__xdp_return() frees the XDP memory based on its memory type,
under which page_pool memory is also handled. This change fixes
the transmit queue timeout while running XDP_TX.

logs:
[  309.069682] icssg-prueth icssg1-eth eth2: NETDEV WATCHDOG: CPU: 0: transmit queue 0 timed out 45860 ms
[  313.933780] icssg-prueth icssg1-eth eth2: NETDEV WATCHDOG: CPU: 0: transmit queue 0 timed out 50724 ms
[  319.053656] icssg-prueth icssg1-eth eth2: NETDEV WATCHDOG: CPU: 0: transmit queue 0 timed out 55844 ms
...

Fixes: 62aa3246f462 ("net: ti: icssg-prueth: Add XDP support")
Signed-off-by: Meghana Malladi <m-malladi@ti.com>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Link: https://patch.msgid.link/20250616063319.3347541-1-m-malladi@ti.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/ti/icssg/icssg_common.c

index 5b8fdb88217272bf6da4891fcd817e1c45be099f..12f25cec6255e9e00722d965c7efddb9e8a6bc61 100644 (file)
@@ -98,20 +98,11 @@ void prueth_xmit_free(struct prueth_tx_chn *tx_chn,
 {
        struct cppi5_host_desc_t *first_desc, *next_desc;
        dma_addr_t buf_dma, next_desc_dma;
-       struct prueth_swdata *swdata;
-       struct page *page;
        u32 buf_dma_len;
 
        first_desc = desc;
        next_desc = first_desc;
 
-       swdata = cppi5_hdesc_get_swdata(desc);
-       if (swdata->type == PRUETH_SWDATA_PAGE) {
-               page = swdata->data.page;
-               page_pool_recycle_direct(page->pp, swdata->data.page);
-               goto free_desc;
-       }
-
        cppi5_hdesc_get_obuf(first_desc, &buf_dma, &buf_dma_len);
        k3_udma_glue_tx_cppi5_to_dma_addr(tx_chn->tx_chn, &buf_dma);
 
@@ -135,7 +126,6 @@ void prueth_xmit_free(struct prueth_tx_chn *tx_chn,
                k3_cppi_desc_pool_free(tx_chn->desc_pool, next_desc);
        }
 
-free_desc:
        k3_cppi_desc_pool_free(tx_chn->desc_pool, first_desc);
 }
 EXPORT_SYMBOL_GPL(prueth_xmit_free);
@@ -612,13 +602,8 @@ u32 emac_xmit_xdp_frame(struct prueth_emac *emac,
        k3_udma_glue_tx_dma_to_cppi5_addr(tx_chn->tx_chn, &buf_dma);
        cppi5_hdesc_attach_buf(first_desc, buf_dma, xdpf->len, buf_dma, xdpf->len);
        swdata = cppi5_hdesc_get_swdata(first_desc);
-       if (page) {
-               swdata->type = PRUETH_SWDATA_PAGE;
-               swdata->data.page = page;
-       } else {
-               swdata->type = PRUETH_SWDATA_XDPF;
-               swdata->data.xdpf = xdpf;
-       }
+       swdata->type = PRUETH_SWDATA_XDPF;
+       swdata->data.xdpf = xdpf;
 
        /* Report BQL before sending the packet */
        netif_txq = netdev_get_tx_queue(ndev, tx_chn->id);