On 25/01/17(Wed) 20:04, David Hill wrote:
> [...]
> Allocate the mbuf beforehand. Also, move the setting of nflag closer
> to where its value is used.
ok mpi@
> Index: uipc_syscalls.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_syscalls.c,v
> retrieving revision 1.147
> diff -u -p -r1.147 uipc_syscalls.c
> --- uipc_syscalls.c 25 Jan 2017 07:35:31 -0000 1.147
> +++ uipc_syscalls.c 26 Jan 2017 01:03:13 -0000
> @@ -265,7 +265,7 @@ doaccept(struct proc *p, int sock, struc
> {
> struct filedesc *fdp = p->p_fd;
> struct file *fp, *headfp;
> - struct mbuf *nam = NULL;
> + struct mbuf *nam;
> socklen_t namelen;
> int error, s, tmpfd;
> struct socket *head, *so;
> @@ -288,7 +288,8 @@ doaccept(struct proc *p, int sock, struc
> return (error);
> }
>
> -redo:
> + nam = m_get(M_WAIT, MT_SONAME);
> +
> NET_LOCK(s);
> head = headfp->f_data;
> if (isdnssocket(head) || (head->so_options & SO_ACCEPTCONN) == 0) {
> @@ -318,30 +319,16 @@ redo:
> goto out;
> }
>
> - /* Figure out whether the new socket should be non-blocking. */
> - nflag = flags & SOCK_NONBLOCK_INHERIT ? (headfp->f_flag & FNONBLOCK)
> - : (flags & SOCK_NONBLOCK ? FNONBLOCK : 0);
> -
> - nam = m_get(M_WAIT, MT_SONAME);
> -
> - /*
> - * Check whether the queue emptied while we slept: m_get() may have
> - * blocked, allowing the connection to be reset or another thread or
> - * process to accept it. If so, start over.
> - */
> - if (head->so_qlen == 0) {
> - NET_UNLOCK(s);
> - m_freem(nam);
> - nam = NULL;
> - goto redo;
> - }
> -
> /*
> * Do not sleep after we have taken the socket out of the queue.
> */
> so = TAILQ_FIRST(&head->so_q);
> if (soqremque(so, 1) == 0)
> panic("accept");
> +
> + /* Figure out whether the new socket should be non-blocking. */
> + nflag = flags & SOCK_NONBLOCK_INHERIT ? (headfp->f_flag & FNONBLOCK)
> + : (flags & SOCK_NONBLOCK ? FNONBLOCK : 0);
>
> /* connection has been removed from the listen queue */
> KNOTE(&head->so_rcv.sb_sel.si_note, 0);
>