On 11/25/20 6:38 PM, David Awogbemila wrote:
> From: Catherine Sullivan <csu...@google.com>
> 



> +     if (tx->raw_addressing)
> +             nsegs = gve_tx_add_skb_no_copy(priv, tx, skb);
> +     else
> +             nsegs = gve_tx_add_skb_copy(priv, tx, skb);
> +
> +     /* If the packet is getting sent, we need to update the skb */
> +     if (nsegs) {
> +             netdev_tx_sent_queue(tx->netdev_txq, skb->len);
> +             skb_tx_timestamp(skb);
> +
> +             /* Give packets to NIC. Even if this packet failed to send the 
> doorbell
> +              * might need to be rung because of xmit_more.
> +              */
> +             tx->req += nsegs;
>  
> -     if (!netif_xmit_stopped(tx->netdev_txq) && netdev_xmit_more())
> -             return NETDEV_TX_OK;
> +             if (!netif_xmit_stopped(tx->netdev_txq) && netdev_xmit_more())
> +                     return NETDEV_TX_OK;
>  
> -     gve_tx_put_doorbell(priv, tx->q_resources, tx->req);
> +             gve_tx_put_doorbell(priv, tx->q_resources, tx->req);
> +     }
>       return NETDEV_TX_OK;
>  }
>

Code does not match the comment (Give packets to NIC.
    Even if this packet failed to send the doorbell
    might need to be rung because of xmit_more.)

You probably meant :

    if (nsegs) {
        netdev_tx_sent_queue(tx->netdev_txq, skb->len);
        skb_tx_timestamp(skb);
        tx->req += nsegs;
        if (!netif_xmit_stopped(tx->netdev_txq) && netdev_xmit_more())
            return NETDEV_TX_OK;
    }
    gve_tx_put_doorbell(priv, tx->q_resources, tx->req);
    return NETDEV_TX_OK;


Or

    if (nsegs) {
        netdev_tx_sent_queue(tx->netdev_txq, skb->len);
        skb_tx_timestamp(skb);
        tx->req += nsegs;
    }
    if (!netif_xmit_stopped(tx->netdev_txq) && netdev_xmit_more())
        return NETDEV_TX_OK;

    gve_tx_put_doorbell(priv, tx->q_resources, tx->req);
    return NETDEV_TX_OK;

Also you forgot to free the skb if it was not sent (in case of mapping error in 
gve_tx_add_skb_no_copy())

So you probably need to call dev_kfree_skb_any(), or risk leaking memory and 
freeze sockets.

    if (nsegs) {
        netdev_tx_sent_queue(tx->netdev_txq, skb->len);
        skb_tx_timestamp(skb);
        tx->req += nsegs;
    } else {
        dev_kfree_skb_any(skb);
    }
    if (!netif_xmit_stopped(tx->netdev_txq) && netdev_xmit_more())
        return NETDEV_TX_OK;

    gve_tx_put_doorbell(priv, tx->q_resources, tx->req);
    return NETDEV_TX_OK;

Reply via email to