so{,un}lock_shared() take the shared net lock for PF_INET and PF_INET6
while sticking to the exclusive rwlock elsewhere.
getsockopt(2), getsockname(2) and getpeername(2) (all UNLOCK) do not
write, so the exclusive net lock is overkill here.
Did I miss anything?
Feedback? OK?
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index ddb612a8043..ea5b07b71e7 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -1268,9 +1268,9 @@ sys_getsockopt(struct proc *p, void *v, register_t
*retval)
valsize = 0;
m = m_get(M_WAIT, MT_SOOPTS);
so = fp->f_data;
- solock(so);
+ solock_shared(so);
error = sogetopt(so, SCARG(uap, level), SCARG(uap, name), m);
- sounlock(so);
+ sounlock_shared(so);
if (error == 0 && SCARG(uap, val) && valsize && m != NULL) {
if (valsize > m->m_len)
valsize = m->m_len;
@@ -1320,9 +1320,9 @@ sys_getsockname(struct proc *p, void *v, register_t
*retval)
goto bad;
}
m = m_getclr(M_WAIT, MT_SONAME);
- solock(so);
+ solock_shared(so);
error = pru_sockaddr(so, m);
- sounlock(so);
+ sounlock_shared(so);
if (error)
goto bad;
error = copyaddrout(p, m, SCARG(uap, asa), len, SCARG(uap, alen));
@@ -1367,9 +1367,9 @@ sys_getpeername(struct proc *p, void *v, register_t
*retval)
if (error)
goto bad;
m = m_getclr(M_WAIT, MT_SONAME);
- solock(so);
+ solock_shared(so);
error = pru_peeraddr(so, m);
- sounlock(so);
+ sounlock_shared(so);
if (error)
goto bad;
error = copyaddrout(p, m, SCARG(uap, asa), len, SCARG(uap, alen));