lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <aWpN2uglFxlJgoVV@lizhi-Precision-Tower-5810>
Date: Fri, 16 Jan 2026 09:40:26 -0500
From: Frank Li <Frank.li@....com>
To: Wei Fang <wei.fang@....com>
Cc: shenwei.wang@....com, xiaoning.wang@....com, andrew+netdev@...n.ch,
	davem@...emloft.net, edumazet@...gle.com, kuba@...nel.org,
	pabeni@...hat.com, ast@...nel.org, daniel@...earbox.net,
	hawk@...nel.org, john.fastabend@...il.com, sdf@...ichev.me,
	netdev@...r.kernel.org, linux-kernel@...r.kernel.org,
	imx@...ts.linux.dev, bpf@...r.kernel.org
Subject: Re: [PATCH v2 net-next 13/14] net: fec: improve fec_enet_tx_queue()

On Fri, Jan 16, 2026 at 03:40:26PM +0800, Wei Fang wrote:
> To support AF_XDP zero-copy mode in the subsequent patch, the following
> adjustments have been made to fec_tx_queue().
>
> 1. Change the parameters of fec_tx_queue().
> 2. Some variables are initialized at the time of declaration, and the
> order of local variables is updated to follow the reverse xmas tree
> style.
> 3. Remove the variable xdpf and add the variable tx_buf.
>
> Signed-off-by: Wei Fang <wei.fang@....com>
> ---
Reviewed-by: Frank Li <Frank.Li@....com>
>  drivers/net/ethernet/freescale/fec_main.c | 43 +++++++++--------------
>  1 file changed, 17 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
> index 68aa94dd9487..7b5fe7da7210 100644
> --- a/drivers/net/ethernet/freescale/fec_main.c
> +++ b/drivers/net/ethernet/freescale/fec_main.c
> @@ -1467,27 +1467,18 @@ fec_enet_hwtstamp(struct fec_enet_private *fep, unsigned ts,
>  	hwtstamps->hwtstamp = ns_to_ktime(ns);
>  }
>
> -static void
> -fec_enet_tx_queue(struct net_device *ndev, u16 queue_id, int budget)
> +static void fec_enet_tx_queue(struct fec_enet_private *fep,
> +			      u16 queue, int budget)
>  {
> -	struct	fec_enet_private *fep;
> -	struct xdp_frame *xdpf;
> -	struct bufdesc *bdp;
> +	struct netdev_queue *nq = netdev_get_tx_queue(fep->netdev, queue);
> +	struct fec_enet_priv_tx_q *txq = fep->tx_queue[queue];
> +	struct net_device *ndev = fep->netdev;
> +	struct bufdesc *bdp = txq->dirty_tx;
> +	int index, frame_len, entries_free;
> +	struct fec_tx_buffer *tx_buf;
>  	unsigned short status;
> -	struct	sk_buff	*skb;
> -	struct fec_enet_priv_tx_q *txq;
> -	struct netdev_queue *nq;
> -	int	index = 0;
> -	int	entries_free;
> +	struct sk_buff *skb;
>  	struct page *page;
> -	int frame_len;
> -
> -	fep = netdev_priv(ndev);
> -
> -	txq = fep->tx_queue[queue_id];
> -	/* get next bdp of dirty_tx */
> -	nq = netdev_get_tx_queue(ndev, queue_id);
> -	bdp = txq->dirty_tx;
>
>  	/* get next bdp of dirty_tx */
>  	bdp = fec_enet_get_nextdesc(bdp, &txq->bd);
> @@ -1500,9 +1491,10 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id, int budget)
>  			break;
>
>  		index = fec_enet_get_bd_index(bdp, &txq->bd);
> +		tx_buf = &txq->tx_buf[index];
>  		frame_len = fec16_to_cpu(bdp->cbd_datlen);
>
> -		switch (txq->tx_buf[index].type) {
> +		switch (tx_buf->type) {
>  		case FEC_TXBUF_T_SKB:
>  			if (bdp->cbd_bufaddr &&
>  			    !IS_TSO_HEADER(txq, fec32_to_cpu(bdp->cbd_bufaddr)))
> @@ -1511,7 +1503,7 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id, int budget)
>  						 frame_len, DMA_TO_DEVICE);
>
>  			bdp->cbd_bufaddr = cpu_to_fec32(0);
> -			skb = txq->tx_buf[index].buf_p;
> +			skb = tx_buf->buf_p;
>  			if (!skb)
>  				goto tx_buf_done;
>
> @@ -1542,19 +1534,18 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id, int budget)
>  			if (unlikely(!budget))
>  				goto out;
>
> -			xdpf = txq->tx_buf[index].buf_p;
>  			dma_unmap_single(&fep->pdev->dev,
>  					 fec32_to_cpu(bdp->cbd_bufaddr),
>  					 frame_len,  DMA_TO_DEVICE);
>  			bdp->cbd_bufaddr = cpu_to_fec32(0);
> -			xdp_return_frame_rx_napi(xdpf);
> +			xdp_return_frame_rx_napi(tx_buf->buf_p);
>  			break;
>  		case FEC_TXBUF_T_XDP_TX:
>  			if (unlikely(!budget))
>  				goto out;
>
>  			bdp->cbd_bufaddr = cpu_to_fec32(0);
> -			page = txq->tx_buf[index].buf_p;
> +			page = tx_buf->buf_p;
>  			/* The dma_sync_size = 0 as XDP_TX has already synced
>  			 * DMA for_device
>  			 */
> @@ -1591,9 +1582,9 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id, int budget)
>  		if (status & BD_ENET_TX_DEF)
>  			ndev->stats.collisions++;
>
> -		txq->tx_buf[index].buf_p = NULL;
> +		tx_buf->buf_p = NULL;
>  		/* restore default tx buffer type: FEC_TXBUF_T_SKB */
> -		txq->tx_buf[index].type = FEC_TXBUF_T_SKB;
> +		tx_buf->type = FEC_TXBUF_T_SKB;
>
>  tx_buf_done:
>  		/* Make sure the update to bdp and tx_buf are performed
> @@ -1629,7 +1620,7 @@ static void fec_enet_tx(struct net_device *ndev, int budget)
>
>  	/* Make sure that AVB queues are processed first. */
>  	for (i = fep->num_tx_queues - 1; i >= 0; i--)
> -		fec_enet_tx_queue(ndev, i, budget);
> +		fec_enet_tx_queue(fep, i, budget);
>  }
>
>  static int fec_enet_update_cbd(struct fec_enet_priv_rx_q *rxq,
> --
> 2.34.1
>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ