Skip to content

Commit

Permalink
pktgen: Avoid dirtying skb->users when txq is full
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Eric Dumazet authored and David S. Miller committed Oct 5, 2009
1 parent b3a5b6c commit 0835acf
Showing 1 changed file with 7 additions and 4 deletions.
11 changes: 7 additions & 4 deletions net/core/pktgen.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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 */
Expand Down

0 comments on commit 0835acf

Please sign in to comment.