From: Vitaliy Makkoveev Subject: Take solock_shared() in soo_stat() To: tech@openbsd.org Date: Wed, 10 Apr 2024 16:09:00 +0300 Only unix(4) and tcp(4) sockets set (*pru_sence)() handler. The rest of soo_stat() is the read only access. solock() can't be pushed down to PCB layer because tcp(4) `so_rcv' still relies on it. Index: sys/kern/sys_socket.c =================================================================== RCS file: /cvs/src/sys/kern/sys_socket.c,v retrieving revision 1.63 diff -u -p -r1.63 sys_socket.c --- sys/kern/sys_socket.c 31 Mar 2024 13:50:00 -0000 1.63 +++ sys/kern/sys_socket.c 10 Apr 2024 13:06:26 -0000 @@ -145,7 +145,7 @@ soo_stat(struct file *fp, struct stat *u memset(ub, 0, sizeof (*ub)); ub->st_mode = S_IFSOCK; - solock(so); + solock_shared(so); mtx_enter(&so->so_rcv.sb_mtx); if ((so->so_rcv.sb_state & SS_CANTRCVMORE) == 0 || so->so_rcv.sb_cc != 0) @@ -156,7 +156,7 @@ soo_stat(struct file *fp, struct stat *u ub->st_uid = so->so_euid; ub->st_gid = so->so_egid; (void)pru_sense(so, ub); - sounlock(so); + sounlock_shared(so); return (0); }