diff options
author | Sean Bruno <sbruno@FreeBSD.org> | 2017-07-25 14:38:30 +0000 |
---|---|---|
committer | Sean Bruno <sbruno@FreeBSD.org> | 2017-07-25 14:38:30 +0000 |
commit | e0ef5a73069bf8d8ab053e8e780e99b470d227a6 (patch) | |
tree | 6500f460850a013c4a12679274265b9a254158cc /sys/dev/ixgbe | |
parent | 288ebd813a1fbeb4bb60d7efa73d6827b547af40 (diff) | |
download | src-e0ef5a73069bf8d8ab053e8e780e99b470d227a6.tar.gz src-e0ef5a73069bf8d8ab053e8e780e99b470d227a6.zip |
Drop ixgbe RX lock during TCP_LRO processing. This eliminates a "storm"
of LOR detection and a bit of lock release/acquire collision when using LRO.
Submitted by: Kevin Bowling <kevin.bowling@kev009.com>
MFC after: 2 days
Differential Revision: https://reviews.freebsd.org/D11712
Notes
Notes:
svn path=/head/; revision=321476
Diffstat (limited to 'sys/dev/ixgbe')
-rw-r--r-- | sys/dev/ixgbe/ix_txrx.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/sys/dev/ixgbe/ix_txrx.c b/sys/dev/ixgbe/ix_txrx.c index 0597493a7ca7..c634afb62e37 100644 --- a/sys/dev/ixgbe/ix_txrx.c +++ b/sys/dev/ixgbe/ix_txrx.c @@ -1593,9 +1593,7 @@ ixgbe_rx_input(struct rx_ring *rxr, struct ifnet *ifp, struct mbuf *m, if (tcp_lro_rx(&rxr->lro, m, 0) == 0) return; } - IXGBE_RX_UNLOCK(rxr); (*ifp->if_input)(ifp, m); - IXGBE_RX_LOCK(rxr); } /* ixgbe_rx_input */ /************************************************************************ @@ -1880,7 +1878,9 @@ next_desc: /* Now send to the stack or do LRO */ if (sendmp != NULL) { rxr->next_to_check = i; + IXGBE_RX_UNLOCK(rxr); ixgbe_rx_input(rxr, ifp, sendmp, ptype); + IXGBE_RX_LOCK(rxr); i = rxr->next_to_check; } @@ -1897,13 +1897,13 @@ next_desc: rxr->next_to_check = i; + IXGBE_RX_UNLOCK(rxr); + /* * Flush any outstanding LRO work */ tcp_lro_flush_all(lro); - IXGBE_RX_UNLOCK(rxr); - /* * Still have cleaning to do? */ |