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:
parent
bd79708dbf
commit
4527476029
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user