Skip to content

Commit 25eb305

Browse files
WeiFang-NXPPaolo Abeni
authored andcommitted
net: fec: add AF_XDP zero-copy support
This patch adds AF_XDP zero-copy support for both TX and RX on the FEC driver. It introduces new functions for XSK buffer allocation, RX/TX queue processing in zero-copy mode, and XSK pool setup/teardown. For RX, fec_alloc_rxq_buffers_zc() is added to allocate RX buffers from XSK pool. And fec_enet_rx_queue_xsk() is used to process the frames from the RX queue which is bound to the AF_XDP socket. Similar to the copy mode, the zero-copy mode also supports XDP_TX, XDP_PASS, XDP_DROP and XDP_REDIRECT actions. In addition, fec_enet_xsk_tx_xmit() is similar to fec_enet_xdp_tx_xmit() and is used to handle XDP_TX action in zero-copy mode. For TX, there are two cases, one is the frames from the AF_XDP socket, so fec_enet_xsk_xmit() is added to directly transmit the frames from the socket and the buffer type is marked as FEC_TXBUF_T_XSK_XMIT. The other one is the frames from the RX queue (XDP_TX action), the buffer type is marked as FEC_TXBUF_T_XSK_TX. Therefore, fec_enet_tx_queue() could correctly clean the TX queue base on the buffer type. Also, some tests have been done on the i.MX93-EVK board with the xdpsock tool, the following are the results. Env: i.MX93 connects to a packet generator, the link speed is 1Gbps, and flow-control is off. The RX packet size is 64 bytes including FCS. Only one RX queue (CPU) is used to receive frames. 1. MAC swap L2 forwarding 1.1 Zero-copy mode root@imx93evk:~# ./xdpsock -i eth0 -l -z sock0@eth0:0 l2fwd xdp-drv pps pkts 1.00 rx 414715 415455 tx 414715 415455 1.2 Copy mode root@imx93evk:~# ./xdpsock -i eth0 -l -c sock0@eth0:0 l2fwd xdp-drv pps pkts 1.00 rx 356396 356609 tx 356396 356609 2. TX only 2.1 Zero-copy mode root@imx93evk:~# ./xdpsock -i eth0 -t -s 64 -z sock0@eth0:0 txonly xdp-drv pps pkts 1.00 rx 0 0 tx 1119573 1126720 2.2 Copy mode root@imx93evk:~# ./xdpsock -i eth0 -t -s 64 -c sock0@eth0:0 txonly xdp-drv pps pkts 1.00 rx 0 0 tx 406864 407616 Signed-off-by: Wei Fang <wei.fang@nxp.com> Link: https://patch.msgid.link/20260205085742.2685134-16-wei.fang@nxp.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
1 parent fee723a commit 25eb305

2 files changed

Lines changed: 754 additions & 44 deletions

File tree

drivers/net/ethernet/freescale/fec.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ struct bufdesc_ex {
340340
#define FEC_ENET_TX_FRPPG (PAGE_SIZE / FEC_ENET_TX_FRSIZE)
341341
#define TX_RING_SIZE 1024 /* Must be power of two */
342342
#define TX_RING_MOD_MASK 511 /* for this to work */
343+
#define FEC_XSK_TX_BUDGET_MAX 256
343344

344345
#define BD_ENET_RX_INT 0x00800000
345346
#define BD_ENET_RX_PTP ((ushort)0x0400)
@@ -528,6 +529,8 @@ enum fec_txbuf_type {
528529
FEC_TXBUF_T_SKB,
529530
FEC_TXBUF_T_XDP_NDO,
530531
FEC_TXBUF_T_XDP_TX,
532+
FEC_TXBUF_T_XSK_XMIT,
533+
FEC_TXBUF_T_XSK_TX,
531534
};
532535

533536
struct fec_tx_buffer {
@@ -539,6 +542,7 @@ struct fec_enet_priv_tx_q {
539542
struct bufdesc_prop bd;
540543
unsigned char *tx_bounce[TX_RING_SIZE];
541544
struct fec_tx_buffer tx_buf[TX_RING_SIZE];
545+
struct xsk_buff_pool *xsk_pool;
542546

543547
unsigned short tx_stop_threshold;
544548
unsigned short tx_wake_threshold;
@@ -548,9 +552,16 @@ struct fec_enet_priv_tx_q {
548552
dma_addr_t tso_hdrs_dma;
549553
};
550554

555+
union fec_rx_buffer {
556+
void *buf_p;
557+
struct page *page;
558+
struct xdp_buff *xdp;
559+
};
560+
551561
struct fec_enet_priv_rx_q {
552562
struct bufdesc_prop bd;
553-
struct page *rx_buf[RX_RING_SIZE];
563+
union fec_rx_buffer rx_buf[RX_RING_SIZE];
564+
struct xsk_buff_pool *xsk_pool;
554565

555566
/* page_pool */
556567
struct page_pool *page_pool;

0 commit comments

Comments
 (0)