On Mon, Jun 04, 2018 at 03:25:17PM +0200, Martin Pieuchot wrote: > For pfkey and routing sockets, calling sofree() in pr_detach is a noop. > The reason is that `SS_NOFDREF' hasn't been set at this point so the > socket won't be freed. > > So I'd like to remove the sofree() and add an assert instead. sofree() > will need to change soon to be able to deal with per-socket locks as > well as global locks. So having fewer of them help. > > ok?
I'm not sure if I like it when implementations differ in use of the socket functions. In general I would prefer if the socket interface is used the same way by all protocols so that reviewing them is simpler. I understand that the mentioned ones are already kind of special snowflakes so maybe this is not an issue. > Index: kern/uipc_socket.c > =================================================================== > RCS file: /cvs/src/sys/kern/uipc_socket.c,v > retrieving revision 1.221 > diff -u -p -r1.221 uipc_socket.c > --- kern/uipc_socket.c 8 May 2018 15:03:27 -0000 1.221 > +++ kern/uipc_socket.c 4 Jun 2018 10:16:30 -0000 > @@ -282,8 +282,7 @@ drop: > error = error2; > } > discard: > - if (so->so_state & SS_NOFDREF) > - panic("soclose NOFDREF: so %p, so_type %d", so, so->so_type); > + KASSERT((so->so_state & SS_NOFDREF) == 0); > so->so_state |= SS_NOFDREF; > sofree(so); > sounlock(s); > @@ -306,8 +305,7 @@ soaccept(struct socket *so, struct mbuf > > soassertlocked(so); > > - if ((so->so_state & SS_NOFDREF) == 0) > - panic("soaccept !NOFDREF: so %p, so_type %d", so, so->so_type); > + KASSERT((so->so_state & SS_NOFDREF) != 0); > so->so_state &= ~SS_NOFDREF; > if ((so->so_state & SS_ISDISCONNECTED) == 0 || > (so->so_proto->pr_flags & PR_ABRTACPTDIS) == 0) > Index: net/pfkeyv2.c > =================================================================== > RCS file: /cvs/src/sys/net/pfkeyv2.c,v > retrieving revision 1.180 > diff -u -p -r1.180 pfkeyv2.c > --- net/pfkeyv2.c 19 May 2018 20:04:55 -0000 1.180 > +++ net/pfkeyv2.c 4 Jun 2018 10:17:11 -0000 > @@ -323,8 +323,9 @@ pfkeyv2_detach(struct socket *so) > refcnt_finalize(&kp->refcnt, "pfkeyrefs"); > > so->so_pcb = NULL; > - sofree(so); > + KASSERT((so->so_state & SS_NOFDREF) == 0); > free(kp, M_PCB, sizeof(struct keycb)); > + > return (0); > } > > Index: net/rtsock.c > =================================================================== > RCS file: /cvs/src/sys/net/rtsock.c,v > retrieving revision 1.265 > diff -u -p -r1.265 rtsock.c > --- net/rtsock.c 14 May 2018 07:33:59 -0000 1.265 > +++ net/rtsock.c 4 Jun 2018 10:17:10 -0000 > @@ -296,7 +296,7 @@ route_detach(struct socket *so) > refcnt_finalize(&rop->refcnt, "rtsockrefs"); > > so->so_pcb = NULL; > - sofree(so); > + KASSERT((so->so_state & SS_NOFDREF) == 0); > free(rop, M_PCB, sizeof(struct routecb)); > > return (0); > -- :wq Claudio