]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: fec: transmit XDP frames in bulk
authorWei Fang <wei.fang@nxp.com>
Thu, 5 Feb 2026 08:57:35 +0000 (16:57 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 10 Feb 2026 09:58:20 +0000 (10:58 +0100)
Currently, the driver writes the ENET_TDAR register for every XDP frame
to trigger transmit start. Frequent MMIO writes consume more CPU cycles
and may reduce XDP TX performance, so transmit XDP frames in bulk.

Signed-off-by: Wei Fang <wei.fang@nxp.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Link: https://patch.msgid.link/20260205085742.2685134-9-wei.fang@nxp.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/freescale/fec_main.c

index b2a6830e6c9b802f4d85be11dc5ea24e759a5fb2..fd89947c5f5f5acaa7d614c143039ea907ba2993 100644 (file)
@@ -2006,6 +2006,8 @@ static int fec_enet_rx_queue_xdp(struct fec_enet_private *fep, int queue,
                                rxq->stats[RX_XDP_TX_ERRORS]++;
                                fec_xdp_drop(rxq, &xdp, sync);
                                trace_xdp_exception(ndev, prog, XDP_TX);
+                       } else {
+                               xdp_res |= FEC_ENET_XDP_TX;
                        }
                        break;
                default:
@@ -2056,6 +2058,10 @@ rx_processing_done:
        if (xdp_res & FEC_ENET_XDP_REDIR)
                xdp_do_flush();
 
+       if (xdp_res & FEC_ENET_XDP_TX)
+               /* Trigger transmission start */
+               fec_txq_trigger_xmit(fep, fep->tx_queue[tx_qid]);
+
        return pkt_received;
 }
 
@@ -4037,9 +4043,6 @@ static int fec_enet_txq_xmit_frame(struct fec_enet_private *fep,
 
        txq->bd.cur = bdp;
 
-       /* Trigger transmission start */
-       fec_txq_trigger_xmit(fep, txq);
-
        return 0;
 }
 
@@ -4089,6 +4092,9 @@ static int fec_enet_xdp_xmit(struct net_device *dev,
                sent_frames++;
        }
 
+       if (sent_frames)
+               fec_txq_trigger_xmit(fep, txq);
+
        __netif_tx_unlock(nq);
 
        return sent_frames;