diff options
author | Steve Hodgson <shodgson@solarflare.com> | 2011-05-23 15:18:45 +0400 |
---|---|---|
committer | Ben Hutchings <bhutchings@solarflare.com> | 2012-02-16 04:25:07 +0400 |
commit | a606f4325dca6950996abbae452d33f2af095f39 (patch) | |
tree | 5d39056ca66b6be3190ff9df902eb404acc17eda /drivers/net/ethernet/sfc/nic.c | |
parent | 90893000e21e2d52a0a9d5aa0c4234c90bcd9470 (diff) | |
download | linux-a606f4325dca6950996abbae452d33f2af095f39.tar.xz |
sfc: Disable flow control during flushes
The TX DMA engine issues upstream read requests when there is room in
the TX FIFO for the completion. However, the fetches for the rest of
the packet might be delayed by any back pressure. Since a flush must
wait for an EOP, the entire flush may be delayed by back pressure.
Mitigate this by disabling flow control before the flushes are
started. Since PF and VF flushes run in parallel introduce
fc_disable, a reference count of the number of flushes outstanding.
The same principle could be applied to Falcon, but that
would bring with it its own testing.
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Diffstat (limited to 'drivers/net/ethernet/sfc/nic.c')
-rw-r--r-- | drivers/net/ethernet/sfc/nic.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/net/ethernet/sfc/nic.c b/drivers/net/ethernet/sfc/nic.c index 539b57441e80..1bb41fff3edc 100644 --- a/drivers/net/ethernet/sfc/nic.c +++ b/drivers/net/ethernet/sfc/nic.c @@ -677,6 +677,7 @@ int efx_nic_flush_queues(struct efx_nic *efx) struct efx_tx_queue *tx_queue; int rc = 0; + efx->fc_disable++; efx->type->prepare_flush(efx); efx_for_each_channel(channel, efx) { @@ -727,6 +728,8 @@ int efx_nic_flush_queues(struct efx_nic *efx) atomic_set(&efx->rxq_flush_outstanding, 0); } + efx->fc_disable--; + return rc; } |