lkml.org 
[lkml]   [2017]   [Nov]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 014/294] net: bcmgenet: fix dev->stats.tx_bytes accounting
    3.16.50-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Petri Gynther <pgynther@google.com>

    commit 55868120a3e5420bf5aa26a816c07d691579c9e6 upstream.

    1. Add bytes_compl local variable to __bcmgenet_tx_reclaim() to collect
    transmitted bytes. dev->stats updates can then be moved outside the
    while-loop. bytes_compl is also needed for future BQL support.
    2. When bcmgenet device uses Tx checksum offload, each transmitted skb
    gets an extra 64-byte header prepended to it. Before this header is
    prepended to the skb, we need to save the skb "wire" length in
    GENET_CB(skb)->bytes_sent, so that proper Tx bytes accounting can
    be done in __bcmgenet_tx_reclaim().
    3. skb->len covers the entire length of skb, whether it is linear or
    fragmented. Thus, when we clean the fragments, do not increase
    transmitted bytes.

    Fixes: 1c1008c793fa ("net: bcmgenet: add main driver file")
    Signed-off-by: Petri Gynther <pgynther@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    [bwh: Backported to 3.16:
    - Also update tx_packets accounting, as done in upstream commit 4092e6acf5cb
    "net: bcmgenet: fix throughtput regression"
    - Adjust context]
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
    +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
    @@ -948,6 +948,8 @@ static void __bcmgenet_tx_reclaim(struct
    struct device *kdev = &priv->pdev->dev;
    struct enet_cb *tx_cb_ptr;
    struct netdev_queue *txq;
    + unsigned int pkts_compl = 0;
    + unsigned int bytes_compl = 0;
    unsigned int c_index;
    unsigned int txbds_ready;
    unsigned int txbds_processed = 0;
    @@ -969,16 +971,14 @@ static void __bcmgenet_tx_reclaim(struct
    while (txbds_processed < txbds_ready) {
    tx_cb_ptr = &priv->tx_cbs[ring->clean_ptr];
    if (tx_cb_ptr->skb) {
    - dev->stats.tx_packets++;
    - dev->stats.tx_bytes += tx_cb_ptr->skb->len;
    + pkts_compl++;
    + bytes_compl += GENET_CB(tx_cb_ptr->skb)->bytes_sent;
    dma_unmap_single(kdev,
    dma_unmap_addr(tx_cb_ptr, dma_addr),
    dma_unmap_len(tx_cb_ptr, dma_len),
    DMA_TO_DEVICE);
    bcmgenet_free_cb(tx_cb_ptr);
    } else if (dma_unmap_addr(tx_cb_ptr, dma_addr)) {
    - dev->stats.tx_bytes +=
    - dma_unmap_len(tx_cb_ptr, dma_len);
    dma_unmap_page(kdev,
    dma_unmap_addr(tx_cb_ptr, dma_addr),
    dma_unmap_len(tx_cb_ptr, dma_len),
    @@ -996,6 +996,9 @@ static void __bcmgenet_tx_reclaim(struct
    ring->free_bds += txbds_processed;
    ring->c_index = (ring->c_index + txbds_processed) & DMA_C_INDEX_MASK;

    + dev->stats.tx_packets += pkts_compl;
    + dev->stats.tx_bytes += bytes_compl;
    +
    if (ring->free_bds > (MAX_SKB_FRAGS + 1))
    ring->int_disable(priv, ring);

    @@ -1215,6 +1218,11 @@ static netdev_tx_t bcmgenet_xmit(struct
    goto out;
    }

    + /* Retain how many bytes will be sent on the wire, without TSB inserted
    + * by transmit checksum offload
    + */
    + GENET_CB(skb)->bytes_sent = skb->len;
    +
    /* set the SKB transmit checksum */
    if (priv->desc_64b_en) {
    ret = bcmgenet_put_tx_csum(dev, skb);
    --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h
    +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h
    @@ -504,6 +504,12 @@ struct bcmgenet_hw_params {
    u32 flags;
    };

    +struct bcmgenet_skb_cb {
    + unsigned int bytes_sent; /* bytes on the wire (no TSB) */
    +};
    +
    +#define GENET_CB(skb) ((struct bcmgenet_skb_cb *)((skb)->cb))
    +
    struct bcmgenet_tx_ring {
    spinlock_t lock; /* ring lock */
    unsigned int index; /* ring index */
    \
     
     \ /
      Last update: 2017-11-08 20:59    [W:4.280 / U:0.584 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site