Message ID | 20230508143831.980668-1-shenwei.wang@nxp.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [RESEND,v4,net,1/1] net: fec: correct the counting of XDP sent frames | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Clearly marked for net |
netdev/apply | success | Patch already applied to net |
On Mon, 8 May 2023 09:38:31 -0500 Shenwei Wang wrote: > In the current xdp_xmit implementation, if any single frame fails to > transmit due to insufficient buffer descriptors, the function nevertheless > reports success in sending all frames. This results in erroneously > indicating that frames were transmitted when in fact they were dropped. > > This patch fixes the issue by ensureing the return value properly > indicates the actual number of frames successfully transmitted, rather than > potentially reporting success for all frames when some could not transmit. > > Fixes: 6d6b39f180b8 ("net: fec: add initial XDP support") > Signed-off-by: Gagandeep Singh <g.singh@nxp.com> > Signed-off-by: Shenwei Wang <shenwei.wang@nxp.com> Unfortunately the previous version was silently applied, it seems: https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/commit/?id=26312c685ae0bca61e06ac75ee158b1e69546415 Could you send an incremental fix, on top of that patch?
> -----Original Message----- > From: Jakub Kicinski <kuba@kernel.org> > Sent: Monday, May 8, 2023 8:46 PM > To: Shenwei Wang <shenwei.wang@nxp.com> > Cc: Wei Fang <wei.fang@nxp.com>; David S. Miller <davem@davemloft.net>; > Eric Dumazet <edumazet@google.com>; Paolo Abeni <pabeni@redhat.com>; > Clark Wang <xiaoning.wang@nxp.com>; dl-linux-imx <linux-imx@nxp.com>; > Alexei Starovoitov <ast@kernel.org>; Daniel Borkmann <daniel@iogearbox.net>; > Jesper Dangaard Brouer <hawk@kernel.org>; John Fastabend > <john.fastabend@gmail.com>; Alexander Lobakin > <alexandr.lobakin@intel.com>; netdev@vger.kernel.org; linux- > kernel@vger.kernel.org; imx@lists.linux.dev; Gagandeep Singh > <G.Singh@nxp.com> > Subject: [EXT] Re: [RESEND PATCH v4 net 1/1] net: fec: correct the counting of > XDP sent frames > > Caution: This is an external email. Please take care when clicking links or > opening attachments. When in doubt, report the message using the 'Report this > email' button > > > On Mon, 8 May 2023 09:38:31 -0500 Shenwei Wang wrote: > > In the current xdp_xmit implementation, if any single frame fails to > > transmit due to insufficient buffer descriptors, the function > > nevertheless reports success in sending all frames. This results in > > erroneously indicating that frames were transmitted when in fact they were > dropped. > > > > This patch fixes the issue by ensureing the return value properly > > indicates the actual number of frames successfully transmitted, rather > > than potentially reporting success for all frames when some could not transmit. > > > > Fixes: 6d6b39f180b8 ("net: fec: add initial XDP support") > > Signed-off-by: Gagandeep Singh <g.singh@nxp.com> > > Signed-off-by: Shenwei Wang <shenwei.wang@nxp.com> > > Unfortunately the previous version was silently applied, it seems: > > https://git.kernel/ > .org%2Fpub%2Fscm%2Flinux%2Fkernel%2Fgit%2Fnetdev%2Fnet.git%2Fcommit > %2F%3Fid%3D26312c685ae0bca61e06ac75ee158b1e69546415&data=05%7C01 > %7Cshenwei.wang%40nxp.com%7C50d9af4da79646cf2d2b08db502f2b7d%7C6 > 86ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0%7C638191935747226987%7C > Unknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6I > k1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=O2uy5iy4QJa9v8TN9t > qM7jqIgVhBY7pMxl4K58abj9s%3D&reserved=0 > > Could you send an incremental fix, on top of that patch? Certainly, I will. Thanks, Shenwei > -- > pw-bot: cr
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 160c1b3525f5..36a3ee304482 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -3798,7 +3798,7 @@ static int fec_enet_txq_xmit_frame(struct fec_enet_private *fep, entries_free = fec_enet_get_free_txdesc_num(txq); if (entries_free < MAX_SKB_FRAGS + 1) { netdev_err(fep->netdev, "NOT enough BD for SG!\n"); - return NETDEV_TX_OK; + return -EBUSY; } /* Fill in a Tx ring entry */ @@ -3812,7 +3812,7 @@ static int fec_enet_txq_xmit_frame(struct fec_enet_private *fep, dma_addr = dma_map_single(&fep->pdev->dev, frame->data, frame->len, DMA_TO_DEVICE); if (dma_mapping_error(&fep->pdev->dev, dma_addr)) - return FEC_ENET_XDP_CONSUMED; + return -ENOMEM; status |= (BD_ENET_TX_INTR | BD_ENET_TX_LAST); if (fep->bufdesc_ex) @@ -3856,6 +3856,7 @@ static int fec_enet_xdp_xmit(struct net_device *dev, struct fec_enet_private *fep = netdev_priv(dev); struct fec_enet_priv_tx_q *txq; int cpu = smp_processor_id(); + unsigned int sent_frames = 0; struct netdev_queue *nq; unsigned int queue; int i; @@ -3866,8 +3867,11 @@ static int fec_enet_xdp_xmit(struct net_device *dev, __netif_tx_lock(nq, cpu); - for (i = 0; i < num_frames; i++) - fec_enet_txq_xmit_frame(fep, txq, frames[i]); + for (i = 0; i < num_frames; i++) { + if (fec_enet_txq_xmit_frame(fep, txq, frames[i]) != 0) + break; + sent_frames++; + } /* Make sure the update to bdp and tx_skbuff are performed. */ wmb(); @@ -3877,7 +3881,7 @@ static int fec_enet_xdp_xmit(struct net_device *dev, __netif_tx_unlock(nq); - return num_frames; + return sent_frames; } static const struct net_device_ops fec_netdev_ops = {