BNX2X: Transmit synchronization
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 27 Feb 2015 23:05:11 +0000 (18:05 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 2 Mar 2015 16:59:11 +0000 (11:59 -0500)
commit4f4dc8ce9a52c78c16a2eae2e27756fe8190be99
tree2fdaf36325f9cc31e8f908b57c6ebd1bc3bd00c5
parent576d7e5e0fd208d5f071f6eddecc85467e95dcd5
BNX2X: Transmit synchronization

The transmit function is called serially, per txdata, meaning there is only
ever one caller of it.  Instead of a netif lock, we use the poker, which
guarantees mutual exclusion (per poke_tracker).

The transmitter stops when the device is full.  Concurrently, the tx_int
could have freed up space in the tx ring.  When tx_int calls poke, poke
will make sure the transmit function runs at least once after poke is
called.  This ensures we don't stall on transmits.

If you're concerned about the network stack calling transmit over and
over while the TX ring is full, we can optimize slightly.  See the notes
above __bnx2x_tx_queue() for details.  In short, poke() is powerful, but
it won't solve all of your problems.
kern/drivers/net/bnx2x/bnx2x.h
kern/drivers/net/bnx2x/bnx2x_cmn.c
kern/drivers/net/bnx2x/bnx2x_cmn.h
kern/drivers/net/bnx2x/bnx2x_dev.c