nfp: count all failed TX attempts as errors
authorJakub Kicinski <jakub.kicinski@netronome.com>
Wed, 5 Jun 2019 21:11:31 +0000 (14:11 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 6 Jun 2019 21:13:39 +0000 (14:13 -0700)
Currently if we need to modify the head of the skb and allocation
fails we would free the skb and not increment the error counter.
Make sure all errors are counted.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/netronome/nfp/nfp_net_common.c

index b82b684f52ce6d3de7f2fc3462955af2267f3a4b..0c163b086de5b8dc081f38f4381699077d4dfd06 100644 (file)
@@ -873,17 +873,14 @@ static int nfp_net_tx(struct sk_buff *skb, struct net_device *netdev)
        }
 
        md_bytes = nfp_net_prep_port_id(skb);
-       if (unlikely(md_bytes < 0)) {
-               nfp_net_tx_xmit_more_flush(tx_ring);
-               dev_kfree_skb_any(skb);
-               return NETDEV_TX_OK;
-       }
+       if (unlikely(md_bytes < 0))
+               goto err_flush;
 
        /* Start with the head skbuf */
        dma_addr = dma_map_single(dp->dev, skb->data, skb_headlen(skb),
                                  DMA_TO_DEVICE);
        if (dma_mapping_error(dp->dev, dma_addr))
-               goto err_free;
+               goto err_dma_err;
 
        wr_idx = D_IDX(tx_ring, tx_ring->wr_p);
 
@@ -979,8 +976,9 @@ err_unmap:
        tx_ring->txbufs[wr_idx].skb = NULL;
        tx_ring->txbufs[wr_idx].dma_addr = 0;
        tx_ring->txbufs[wr_idx].fidx = -2;
-err_free:
+err_dma_err:
        nn_dp_warn(dp, "Failed to map DMA TX buffer\n");
+err_flush:
        nfp_net_tx_xmit_more_flush(tx_ring);
        u64_stats_update_begin(&r_vec->tx_sync);
        r_vec->tx_errors++;