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
This commit is contained in:
Sean Bruno 2017-07-25 14:38:30 +00:00
parent 288ebd813a
commit e0ef5a7306

View File

@ -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 @@ ixgbe_rxeof(struct ix_queue *que)
/* 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 @@ ixgbe_rxeof(struct ix_queue *que)
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?
*/