Skip to content

Commit 26312c6

Browse files
Shenwei Wangdavem330
authored andcommitted
net: fec: correct the counting of XDP sent frames
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: 6d6b39f ("net: fec: add initial XDP support") Signed-off-by: Gagandeep Singh <g.singh@nxp.com> Signed-off-by: Shenwei Wang <shenwei.wang@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 299efdc commit 26312c6

1 file changed

Lines changed: 9 additions & 4 deletions

File tree

drivers/net/ethernet/freescale/fec_main.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3798,7 +3798,8 @@ static int fec_enet_txq_xmit_frame(struct fec_enet_private *fep,
37983798
entries_free = fec_enet_get_free_txdesc_num(txq);
37993799
if (entries_free < MAX_SKB_FRAGS + 1) {
38003800
netdev_err(fep->netdev, "NOT enough BD for SG!\n");
3801-
return NETDEV_TX_OK;
3801+
xdp_return_frame(frame);
3802+
return NETDEV_TX_BUSY;
38023803
}
38033804

38043805
/* Fill in a Tx ring entry */
@@ -3856,6 +3857,7 @@ static int fec_enet_xdp_xmit(struct net_device *dev,
38563857
struct fec_enet_private *fep = netdev_priv(dev);
38573858
struct fec_enet_priv_tx_q *txq;
38583859
int cpu = smp_processor_id();
3860+
unsigned int sent_frames = 0;
38593861
struct netdev_queue *nq;
38603862
unsigned int queue;
38613863
int i;
@@ -3866,8 +3868,11 @@ static int fec_enet_xdp_xmit(struct net_device *dev,
38663868

38673869
__netif_tx_lock(nq, cpu);
38683870

3869-
for (i = 0; i < num_frames; i++)
3870-
fec_enet_txq_xmit_frame(fep, txq, frames[i]);
3871+
for (i = 0; i < num_frames; i++) {
3872+
if (fec_enet_txq_xmit_frame(fep, txq, frames[i]) != 0)
3873+
break;
3874+
sent_frames++;
3875+
}
38713876

38723877
/* Make sure the update to bdp and tx_skbuff are performed. */
38733878
wmb();
@@ -3877,7 +3882,7 @@ static int fec_enet_xdp_xmit(struct net_device *dev,
38773882

38783883
__netif_tx_unlock(nq);
38793884

3880-
return num_frames;
3885+
return sent_frames;
38813886
}
38823887

38833888
static const struct net_device_ops fec_netdev_ops = {

0 commit comments

Comments
 (0)