pktgen: Avoid dirtying skb->users when txq is full
authorEric Dumazet <eric.dumazet@gmail.com>
Wed, 30 Sep 2009 13:03:33 +0000 (13:03 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 5 Oct 2009 07:21:54 +0000 (00:21 -0700)
We can avoid two atomic ops on skb->users if packet is not going to be
sent to the device (because hardware txqueue is full)

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Acked-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/pktgen.c

index b69455217ed6270fae1b3d6c4b011cf53b7a7f95..e856ab0d074582ee6ed282158989b90773307981 100644 (file)
@@ -3441,12 +3441,14 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev)
        txq = netdev_get_tx_queue(odev, queue_map);
 
        __netif_tx_lock_bh(txq);
-       atomic_inc(&(pkt_dev->skb->users));
 
-       if (unlikely(netif_tx_queue_stopped(txq) || netif_tx_queue_frozen(txq)))
+       if (unlikely(netif_tx_queue_stopped(txq) || netif_tx_queue_frozen(txq))) {
                ret = NETDEV_TX_BUSY;
-       else
-               ret = (*xmit)(pkt_dev->skb, odev);
+               pkt_dev->last_ok = 0;
+               goto unlock;
+       }
+       atomic_inc(&(pkt_dev->skb->users));
+       ret = (*xmit)(pkt_dev->skb, odev);
 
        switch (ret) {
        case NETDEV_TX_OK:
@@ -3468,6 +3470,7 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev)
                atomic_dec(&(pkt_dev->skb->users));
                pkt_dev->last_ok = 0;
        }
+unlock:
        __netif_tx_unlock_bh(txq);
 
        /* If pkt_dev->count is zero, then run forever */