From: Vitaliy Makkoveev Subject: Re: unlock socket close To: Alexander Bluhm Cc: tech@openbsd.org Date: Tue, 15 Jul 2025 03:01:02 +0300 On Tue, Jul 15, 2025 at 12:32:51AM +0200, Alexander Bluhm wrote: > On Mon, Jul 14, 2025 at 08:18:07PM +0200, Alexander Bluhm wrote: > > This diff is needed to run close(2) system call with shared netlock. > > After parts have been commited, this is the remaining chunk that > actually swiches soclose() and sofree() to shared netlock. > > bluhm > Was OKed by me as a part of combined diff. > Index: kern/uipc_socket.c > =================================================================== > RCS file: /data/mirror/openbsd/cvs/src/sys/kern/uipc_socket.c,v > diff -u -p -r1.380 uipc_socket.c > --- kern/uipc_socket.c 2 Jul 2025 16:44:40 -0000 1.380 > +++ kern/uipc_socket.c 14 Jul 2025 22:29:29 -0000 > @@ -213,10 +213,7 @@ socreate(int dom, struct socket **aso, i > if (error) { > so->so_state |= SS_NOFDREF; > /* sofree() calls sounlock(). */ > - soref(so); > - sofree(so, 1); > - sounlock_shared(so); > - sorele(so); > + sofree(so, 0); > return (error); > } > sounlock_shared(so); > @@ -304,7 +301,7 @@ sofree(struct socket *so, int keep_lock) > > if (so->so_pcb || (so->so_state & SS_NOFDREF) == 0) { > if (!keep_lock) > - sounlock(so); > + sounlock_shared(so); > return; > } > if (so->so_head) { > @@ -317,7 +314,7 @@ sofree(struct socket *so, int keep_lock) > */ > if (so->so_onq == &head->so_q) { > if (!keep_lock) > - sounlock(so); > + sounlock_shared(so); > return; > } > > @@ -344,7 +341,7 @@ sofree(struct socket *so, int keep_lock) > } > > if (!keep_lock) > - sounlock(so); > + sounlock_shared(so); > sorele(so); > } > > @@ -368,7 +365,7 @@ soclose(struct socket *so, int flags) > struct socket *so2; > int error = 0; > > - solock(so); > + solock_shared(so); > /* Revoke async IO early. There is a final revocation in sofree(). */ > sigio_free(&so->so_sigio); > if (so->so_state & SS_ISCONNECTED) { > @@ -430,7 +427,7 @@ discard: > if (so->so_sp) { > struct socket *soback; > > - sounlock(so); > + sounlock_shared(so); > /* > * Concurrent sounsplice() locks `sb_mtx' mutexes on > * both `so_snd' and `so_rcv' before unsplice sockets. > @@ -477,7 +474,7 @@ notsplicedback: > task_del(sosplice_taskq, &so->so_sp->ssp_task); > taskq_barrier(sosplice_taskq); > > - solock(so); > + solock_shared(so); > } > #endif /* SOCKET_SPLICE */ > >