Currently, when tcp_input() receives a packet on a session that matches a

TCPCB, it checks (so->so_options & SO_ACCEPTCONN) to determine whether or
not the socket is a listening socket. However, this causes the code to
access a different cacheline. If we first check if the socket is in the
LISTEN state, we can avoid accessing so->so_options when processing packets
received for ESTABLISHED sessions.

If INVARIANTS is defined, the code still needs to access both variables to
check that so->so_options is consistent with the state.

Reviewed by:	gallatin
MFC after:	1 week
Sponsored by:	Netflix
This commit is contained in:
Jonathan T. Looney 2016-10-12 02:30:33 +00:00
parent bd79708dbf
commit 4527476029

View File

@ -1071,11 +1071,11 @@ tcp_input(struct mbuf **mp, int *offp, int proto)
* state) we look into the SYN cache if this is a new connection
* attempt or the completion of a previous one.
*/
if (so->so_options & SO_ACCEPTCONN) {
KASSERT(tp->t_state == TCPS_LISTEN || !(so->so_options & SO_ACCEPTCONN),
("%s: so accepting but tp %p not listening", __func__, tp));
if (tp->t_state == TCPS_LISTEN && (so->so_options & SO_ACCEPTCONN)) {
struct in_conninfo inc;
KASSERT(tp->t_state == TCPS_LISTEN, ("%s: so accepting but "
"tp not listening", __func__));
bzero(&inc, sizeof(inc));
#ifdef INET6
if (isipv6) {