tcp_usr_attach() doesn't need network epoch. in_pcbfree() and

in_pcbdetach() perform all necessary synchronization themselves.
This commit is contained in:
Gleb Smirnoff 2020-01-22 06:01:26 +00:00
parent 6a2954a17d
commit 7669c586da
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=356978

View File

@ -151,7 +151,6 @@ static void tcp_fill_info(struct tcpcb *, struct tcp_info *);
static int
tcp_usr_attach(struct socket *so, int proto, struct thread *td)
{
struct epoch_tracker et;
struct inpcb *inp;
struct tcpcb *tp = NULL;
int error;
@ -169,12 +168,9 @@ tcp_usr_attach(struct socket *so, int proto, struct thread *td)
so->so_rcv.sb_flags |= SB_AUTOSIZE;
so->so_snd.sb_flags |= SB_AUTOSIZE;
NET_EPOCH_ENTER(et);
error = in_pcballoc(so, &V_tcbinfo);
if (error) {
NET_EPOCH_EXIT(et);
if (error)
goto out;
}
inp = sotoinpcb(so);
#ifdef INET6
if (inp->inp_vflag & INP_IPV6PROTO) {
@ -188,15 +184,13 @@ tcp_usr_attach(struct socket *so, int proto, struct thread *td)
inp->inp_vflag |= INP_IPV4;
tp = tcp_newtcpcb(inp);
if (tp == NULL) {
error = ENOBUFS;
in_pcbdetach(inp);
in_pcbfree(inp);
NET_EPOCH_EXIT(et);
error = ENOBUFS;
goto out;
}
tp->t_state = TCPS_CLOSED;
INP_WUNLOCK(inp);
NET_EPOCH_EXIT(et);
TCPSTATES_INC(TCPS_CLOSED);
if ((so->so_options & SO_LINGER) && so->so_linger == 0)
so->so_linger = TCP_LINGERTIME;