summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2008-04-17 21:38:18 +0000
committerrwatson <rwatson@FreeBSD.org>2008-04-17 21:38:18 +0000
commitca47fccd6b260693108c5ee5634bd0e011c67f5e (patch)
treefd64d5b5062ffc1979994100cac82014c5ed48b6
parent3e83d6e7db0e2c7d805fd36da3475e635fbb4b3e (diff)
downloadFreeBSD-src-ca47fccd6b260693108c5ee5634bd0e011c67f5e.zip
FreeBSD-src-ca47fccd6b260693108c5ee5634bd0e011c67f5e.tar.gz
Convert pcbinfo and inpcb mutexes to rwlocks, and modify macros to
explicitly select write locking for all use of the inpcb mutex. Update some pcbinfo lock assertions to assert locked rather than write-locked, although in practice almost all uses of the pcbinfo rwlock main exclusive, and all instances of inpcb lock acquisition are exclusive. This change should introduce (ideally) little functional change. However, it lays the groundwork for significantly increased parallelism in the TCP/IP code. MFC after: 3 months Tested by: kris (superset of committered patch)
-rw-r--r--sys/contrib/pf/net/pf.c8
-rw-r--r--sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c4
-rw-r--r--sys/kern/subr_witness.c10
-rw-r--r--sys/netinet/in_mcast.c56
-rw-r--r--sys/netinet/in_pcb.c71
-rw-r--r--sys/netinet/in_pcb.h44
-rw-r--r--sys/netinet/ip_divert.c34
-rw-r--r--sys/netinet/ip_fw2.c6
-rw-r--r--sys/netinet/ip_options.c2
-rw-r--r--sys/netinet/ip_output.c14
-rw-r--r--sys/netinet/raw_ip.c62
-rw-r--r--sys/netinet/tcp_input.c40
-rw-r--r--sys/netinet/tcp_output.c2
-rw-r--r--sys/netinet/tcp_reass.c2
-rw-r--r--sys/netinet/tcp_sack.c16
-rw-r--r--sys/netinet/tcp_subr.c58
-rw-r--r--sys/netinet/tcp_syncache.c12
-rw-r--r--sys/netinet/tcp_timer.c32
-rw-r--r--sys/netinet/tcp_timewait.c28
-rw-r--r--sys/netinet/tcp_usrreq.c136
-rw-r--r--sys/netinet/udp_usrreq.c70
-rw-r--r--sys/netinet6/icmp6.c8
-rw-r--r--sys/netinet6/in6_pcb.c36
-rw-r--r--sys/netinet6/in6_src.c2
-rw-r--r--sys/netinet6/raw_ip6.c34
-rw-r--r--sys/netinet6/udp6_usrreq.c50
-rw-r--r--sys/security/audit/audit_arg.c4
-rw-r--r--sys/security/mac/mac_inet.c6
28 files changed, 434 insertions, 413 deletions
diff --git a/sys/contrib/pf/net/pf.c b/sys/contrib/pf/net/pf.c
index 69a7de5..69fe3de 100644
--- a/sys/contrib/pf/net/pf.c
+++ b/sys/contrib/pf/net/pf.c
@@ -2915,7 +2915,7 @@ pf_socket_lookup(int direction, struct pf_pdesc *pd)
pd->lookup.pid = NO_PID; /* XXX: revisit */
#ifdef __FreeBSD__
if (inp_arg != NULL) {
- INP_LOCK_ASSERT(inp_arg);
+ INP_WLOCK_ASSERT(inp_arg);
if (inp_arg->inp_socket) {
pd->lookup.uid = inp_arg->inp_socket->so_cred->cr_uid;
pd->lookup.gid =
@@ -3018,15 +3018,15 @@ pf_socket_lookup(int direction, struct pf_pdesc *pd)
return (-1);
}
#ifdef __FreeBSD__
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if ((inp->inp_socket == NULL) || (inp->inp_socket->so_cred == NULL)) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_RUNLOCK(pi);
return (-1);
}
pd->lookup.uid = inp->inp_socket->so_cred->cr_uid;
pd->lookup.gid = inp->inp_socket->so_cred->cr_groups[0];
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_RUNLOCK(pi);
#else
pd->lookup.uid = inp->inp_socket->so_euid;
diff --git a/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c b/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c
index 2ad4520..2f9a92e 100644
--- a/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c
+++ b/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c
@@ -336,9 +336,9 @@ copy_data(const struct mbuf *m, int offset, int len, struct uio *uio)
static void
cxgb_wait_dma_completion(struct toepcb *toep)
{
- struct mtx *lock;
+ struct rwlock *lock;
- lock = &toep->tp_tp->t_inpcb->inp_mtx;
+ lock = &toep->tp_tp->t_inpcb->inp_lock;
inp_wlock(toep->tp_tp->t_inpcb);
cv_wait_unlock(&toep->tp_cv, lock);
}
diff --git a/sys/kern/subr_witness.c b/sys/kern/subr_witness.c
index da114f1..f54e087 100644
--- a/sys/kern/subr_witness.c
+++ b/sys/kern/subr_witness.c
@@ -346,7 +346,7 @@ static struct witness_order_list_entry order_lists[] = {
/*
* Multicast - protocol locks before interface locks, after UDP locks.
*/
- { "udpinp", &lock_class_mtx_sleep },
+ { "udpinp", &lock_class_rw },
{ "in_multi_mtx", &lock_class_mtx_sleep },
{ "igmp_mtx", &lock_class_mtx_sleep },
{ "if_addr_mtx", &lock_class_mtx_sleep },
@@ -360,15 +360,15 @@ static struct witness_order_list_entry order_lists[] = {
/*
* UDP/IP
*/
- { "udp", &lock_class_mtx_sleep },
- { "udpinp", &lock_class_mtx_sleep },
+ { "udp", &lock_class_rw },
+ { "udpinp", &lock_class_rw },
{ "so_snd", &lock_class_mtx_sleep },
{ NULL, NULL },
/*
* TCP/IP
*/
- { "tcp", &lock_class_mtx_sleep },
- { "tcpinp", &lock_class_mtx_sleep },
+ { "tcp", &lock_class_rw },
+ { "tcpinp", &lock_class_rw },
{ "so_snd", &lock_class_mtx_sleep },
{ NULL, NULL },
/*
diff --git a/sys/netinet/in_mcast.c b/sys/netinet/in_mcast.c
index 34e7916..be2208a 100644
--- a/sys/netinet/in_mcast.c
+++ b/sys/netinet/in_mcast.c
@@ -651,7 +651,7 @@ inp_change_source_filter(struct inpcb *inp, struct sockopt *sopt)
}
out_locked:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (error);
}
@@ -667,11 +667,11 @@ inp_findmoptions(struct inpcb *inp)
struct in_mfilter *imfp;
size_t idx;
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_moptions != NULL)
return (inp->inp_moptions);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
imo = (struct ip_moptions *)malloc(sizeof(*imo), M_IPMOPTS,
M_WAITOK);
@@ -698,7 +698,7 @@ inp_findmoptions(struct inpcb *inp)
}
imo->imo_mfilters = imfp;
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_moptions != NULL) {
free(imfp, M_IPMSOURCE);
free(immp, M_IPMOPTS);
@@ -762,12 +762,12 @@ inp_get_source_filters(struct inpcb *inp, struct sockopt *sopt)
int error;
size_t idx;
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
imo = inp->inp_moptions;
KASSERT(imo != NULL, ("%s: null ip_moptions", __func__));
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyin(sopt, &msfr, sizeof(struct __msfilterreq),
sizeof(struct __msfilterreq));
@@ -781,7 +781,7 @@ inp_get_source_filters(struct inpcb *inp, struct sockopt *sopt)
if (ifp == NULL)
return (EINVAL);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
/*
* Lookup group on the socket.
@@ -789,7 +789,7 @@ inp_get_source_filters(struct inpcb *inp, struct sockopt *sopt)
gsa = (sockunion_t *)&msfr.msfr_group;
idx = imo_match_group(imo, ifp, &gsa->sa);
if (idx == -1 || imo->imo_mfilters == NULL) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (EADDRNOTAVAIL);
}
@@ -826,7 +826,7 @@ inp_get_source_filters(struct inpcb *inp, struct sockopt *sopt)
}
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
if (tss != NULL) {
error = copyout(tss, msfr.msfr_srcs,
@@ -855,7 +855,7 @@ inp_getmoptions(struct inpcb *inp, struct sockopt *sopt)
int error, optval;
u_char coptval;
- INP_LOCK(inp);
+ INP_WLOCK(inp);
imo = inp->inp_moptions;
/*
* If socket is neither of type SOCK_RAW or SOCK_DGRAM,
@@ -864,7 +864,7 @@ inp_getmoptions(struct inpcb *inp, struct sockopt *sopt)
if (inp->inp_socket->so_proto->pr_protocol == IPPROTO_DIVERT ||
(inp->inp_socket->so_proto->pr_type != SOCK_RAW &&
inp->inp_socket->so_proto->pr_type != SOCK_DGRAM)) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (EOPNOTSUPP);
}
@@ -875,7 +875,7 @@ inp_getmoptions(struct inpcb *inp, struct sockopt *sopt)
optval = imo->imo_multicast_vif;
else
optval = -1;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyout(sopt, &optval, sizeof(int));
break;
@@ -894,7 +894,7 @@ inp_getmoptions(struct inpcb *inp, struct sockopt *sopt)
}
}
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
if (sopt->sopt_valsize == sizeof(struct ip_mreqn)) {
error = sooptcopyout(sopt, &mreqn,
sizeof(struct ip_mreqn));
@@ -909,7 +909,7 @@ inp_getmoptions(struct inpcb *inp, struct sockopt *sopt)
optval = coptval = IP_DEFAULT_MULTICAST_TTL;
else
optval = coptval = imo->imo_multicast_ttl;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
if (sopt->sopt_valsize == sizeof(u_char))
error = sooptcopyout(sopt, &coptval, sizeof(u_char));
else
@@ -921,7 +921,7 @@ inp_getmoptions(struct inpcb *inp, struct sockopt *sopt)
optval = coptval = IP_DEFAULT_MULTICAST_LOOP;
else
optval = coptval = imo->imo_multicast_loop;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
if (sopt->sopt_valsize == sizeof(u_char))
error = sooptcopyout(sopt, &coptval, sizeof(u_char));
else
@@ -931,14 +931,14 @@ inp_getmoptions(struct inpcb *inp, struct sockopt *sopt)
case IP_MSFILTER:
if (imo == NULL) {
error = EADDRNOTAVAIL;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
} else {
error = inp_get_source_filters(inp, sopt);
}
break;
default:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = ENOPROTOOPT;
break;
}
@@ -1192,14 +1192,14 @@ inp_join_group(struct inpcb *inp, struct sockopt *sopt)
* to prevent a lock order reversal.
*/
--imo->imo_num_memberships;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
in_delmulti(inm);
return (error);
}
}
out_locked:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (error);
}
@@ -1382,7 +1382,7 @@ inp_leave_group(struct inpcb *inp, struct sockopt *sopt)
imo->imo_num_memberships--;
out_locked:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (error);
}
@@ -1454,7 +1454,7 @@ inp_set_multicast_if(struct inpcb *inp, struct sockopt *sopt)
imo = inp_findmoptions(inp);
imo->imo_multicast_ifp = ifp;
imo->imo_multicast_addr.s_addr = INADDR_ANY;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (0);
}
@@ -1545,7 +1545,7 @@ inp_set_source_filters(struct inpcb *inp, struct sockopt *sopt)
* in order to satisfy a malloc request.
* We will re-take it before changing socket state.
*/
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
#ifdef DIAGNOSTIC
if (bootverbose) {
printf("%s: loading %lu source list entries\n",
@@ -1646,7 +1646,7 @@ inp_set_source_filters(struct inpcb *inp, struct sockopt *sopt)
* Re-take the inp lock; we are changing socket state.
*/
pkss = kss;
- INP_LOCK(inp);
+ INP_WLOCK(inp);
for (i = 0; i < msfr.msfr_nsrcs; i++, pkss++) {
memcpy(&(pnims[i]->ims_addr), pkss,
sizeof(struct sockaddr_storage));
@@ -1661,11 +1661,11 @@ inp_set_source_filters(struct inpcb *inp, struct sockopt *sopt)
/*
* Update the filter mode on the socket before releasing the inpcb.
*/
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
imf->imf_fmode = msfr.msfr_fmode;
out_locked:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (error);
}
@@ -1716,7 +1716,7 @@ inp_setmoptions(struct inpcb *inp, struct sockopt *sopt)
}
imo = inp_findmoptions(inp);
imo->imo_multicast_vif = vifi;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
break;
}
@@ -1753,7 +1753,7 @@ inp_setmoptions(struct inpcb *inp, struct sockopt *sopt)
}
imo = inp_findmoptions(inp);
imo->imo_multicast_ttl = ttl;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
break;
}
@@ -1782,7 +1782,7 @@ inp_setmoptions(struct inpcb *inp, struct sockopt *sopt)
}
imo = inp_findmoptions(inp);
imo->imo_multicast_loop = !!loop;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
break;
}
diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c
index f6a45cb..d13418f1 100644
--- a/sys/netinet/in_pcb.c
+++ b/sys/netinet/in_pcb.c
@@ -218,7 +218,7 @@ in_pcballoc(struct socket *so, struct inpcbinfo *pcbinfo)
if (ip6_auto_flowlabel)
inp->inp_flags |= IN6P_AUTOFLOWLABEL;
#endif
- INP_LOCK(inp);
+ INP_WLOCK(inp);
inp->inp_gencnt = ++pcbinfo->ipi_gencnt;
#if defined(IPSEC) || defined(MAC)
@@ -235,7 +235,7 @@ in_pcbbind(struct inpcb *inp, struct sockaddr *nam, struct ucred *cred)
int anonport, error;
INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if (inp->inp_lport != 0 || inp->inp_laddr.s_addr != INADDR_ANY)
return (EINVAL);
@@ -278,7 +278,11 @@ in_pcbbind_setup(struct inpcb *inp, struct sockaddr *nam, in_addr_t *laddrp,
int error, prison = 0;
int dorandom;
- INP_INFO_WLOCK_ASSERT(pcbinfo);
+ /*
+ * Because no actual state changes occur here, a write global write
+ * lock on the pcbinfo isn't required.
+ */
+ INP_INFO_LOCK_ASSERT(pcbinfo);
INP_LOCK_ASSERT(inp);
if (TAILQ_EMPTY(&in_ifaddrhead)) /* XXX broken! */
@@ -484,7 +488,7 @@ in_pcbconnect(struct inpcb *inp, struct sockaddr *nam, struct ucred *cred)
int anonport, error;
INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
lport = inp->inp_lport;
laddr = inp->inp_laddr.s_addr;
@@ -546,7 +550,11 @@ in_pcbconnect_setup(struct inpcb *inp, struct sockaddr *nam,
u_short lport, fport;
int error;
- INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
+ /*
+ * Because a global state change doesn't actually occur here, a read
+ * lock is sufficient.
+ */
+ INP_INFO_LOCK_ASSERT(inp->inp_pcbinfo);
INP_LOCK_ASSERT(inp);
if (oinpp != NULL)
@@ -666,7 +674,7 @@ in_pcbdisconnect(struct inpcb *inp)
{
INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
inp->inp_faddr.s_addr = INADDR_ANY;
inp->inp_fport = 0;
@@ -695,8 +703,9 @@ in_pcbfree(struct inpcb *inp)
struct inpcbinfo *ipi = inp->inp_pcbinfo;
KASSERT(inp->inp_socket == NULL, ("in_pcbfree: inp_socket != NULL"));
+
INP_INFO_WLOCK_ASSERT(ipi);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
#ifdef IPSEC
ipsec4_delete_pcbpolicy(inp);
@@ -712,7 +721,7 @@ in_pcbfree(struct inpcb *inp)
#ifdef MAC
mac_inpcb_destroy(inp);
#endif
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
uma_zfree(ipi->ipi_zone, inp);
}
@@ -727,7 +736,7 @@ in_pcbdrop(struct inpcb *inp)
{
INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
inp->inp_vflag |= INP_DROPPED;
if (inp->inp_lport) {
@@ -771,10 +780,10 @@ in_getsockaddr(struct socket *so, struct sockaddr **nam)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("in_getsockaddr: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
port = inp->inp_lport;
addr = inp->inp_laddr;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
*nam = in_sockaddr(port, &addr);
return 0;
@@ -790,10 +799,10 @@ in_getpeeraddr(struct socket *so, struct sockaddr **nam)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("in_getpeeraddr: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
port = inp->inp_fport;
addr = inp->inp_faddr;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
*nam = in_sockaddr(port, &addr);
return 0;
@@ -807,20 +816,20 @@ in_pcbnotifyall(struct inpcbinfo *pcbinfo, struct in_addr faddr, int errno,
INP_INFO_WLOCK(pcbinfo);
LIST_FOREACH_SAFE(inp, pcbinfo->ipi_listhead, inp_list, inp_temp) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
#ifdef INET6
if ((inp->inp_vflag & INP_IPV4) == 0) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
continue;
}
#endif
if (inp->inp_faddr.s_addr != faddr.s_addr ||
inp->inp_socket == NULL) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
continue;
}
if ((*notify)(inp, errno))
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
INP_INFO_WUNLOCK(pcbinfo);
}
@@ -834,7 +843,7 @@ in_pcbpurgeif0(struct inpcbinfo *pcbinfo, struct ifnet *ifp)
INP_INFO_RLOCK(pcbinfo);
LIST_FOREACH(inp, pcbinfo->ipi_listhead, inp_list) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
imo = inp->inp_moptions;
if ((inp->inp_vflag & INP_IPV4) &&
imo != NULL) {
@@ -860,7 +869,7 @@ in_pcbpurgeif0(struct inpcbinfo *pcbinfo, struct ifnet *ifp)
}
imo->imo_num_memberships -= gap;
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
INP_INFO_RUNLOCK(pcbinfo);
}
@@ -882,7 +891,7 @@ in_pcblookup_local(struct inpcbinfo *pcbinfo, struct in_addr laddr,
int wildcard;
u_short lport = lport_arg;
- INP_INFO_WLOCK_ASSERT(pcbinfo);
+ INP_INFO_LOCK_ASSERT(pcbinfo);
if (!wild_okay) {
struct inpcbhead *head;
@@ -989,7 +998,7 @@ in_pcblookup_hash(struct inpcbinfo *pcbinfo, struct in_addr faddr,
struct inpcb *inp;
u_short fport = fport_arg, lport = lport_arg;
- INP_INFO_RLOCK_ASSERT(pcbinfo);
+ INP_INFO_LOCK_ASSERT(pcbinfo);
/*
* First look for an exact match.
@@ -1064,7 +1073,7 @@ in_pcbinshash(struct inpcb *inp)
u_int32_t hashkey_faddr;
INP_INFO_WLOCK_ASSERT(pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
#ifdef INET6
if (inp->inp_vflag & INP_IPV6)
@@ -1118,7 +1127,7 @@ in_pcbrehash(struct inpcb *inp)
u_int32_t hashkey_faddr;
INP_INFO_WLOCK_ASSERT(pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
#ifdef INET6
if (inp->inp_vflag & INP_IPV6)
@@ -1143,7 +1152,7 @@ in_pcbremlists(struct inpcb *inp)
struct inpcbinfo *pcbinfo = inp->inp_pcbinfo;
INP_INFO_WLOCK_ASSERT(pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
inp->inp_gencnt = ++pcbinfo->ipi_gencnt;
if (inp->inp_lport) {
@@ -1173,11 +1182,11 @@ in_pcbsosetlabel(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("in_pcbsosetlabel: so->so_pcb == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
SOCK_LOCK(so);
mac_inpcb_sosetlabel(so, inp);
SOCK_UNLOCK(so);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
#endif
}
@@ -1205,28 +1214,28 @@ void
inp_wlock(struct inpcb *inp)
{
- INP_LOCK(inp);
+ INP_WLOCK(inp);
}
void
inp_wunlock(struct inpcb *inp)
{
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
void
inp_rlock(struct inpcb *inp)
{
- INP_LOCK(inp);
+ INP_WLOCK(inp);
}
void
inp_runlock(struct inpcb *inp)
{
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
#ifdef INVARIANTS
@@ -1234,7 +1243,7 @@ void
inp_lock_assert(struct inpcb *inp)
{
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
}
void
diff --git a/sys/netinet/in_pcb.h b/sys/netinet/in_pcb.h
index 2bdfb4e..afb4dd2 100644
--- a/sys/netinet/in_pcb.h
+++ b/sys/netinet/in_pcb.h
@@ -36,9 +36,14 @@
#include <sys/queue.h>
#include <sys/_lock.h>
#include <sys/_mutex.h>
+#include <sys/_rwlock.h>
#include <net/route.h>
+#ifdef _KERNEL
+#include <sys/rwlock.h>
+#endif
+
#define in6pcb inpcb /* for KAME src sync over BSD*'s */
#define in6p_sp inp_sp /* for KAME src sync over BSD*'s */
struct inpcbpolicy;
@@ -171,7 +176,7 @@ struct inpcb {
struct inpcbport *inp_phd; /* head of this list */
#define inp_zero_size offsetof(struct inpcb, inp_gencnt)
inp_gen_t inp_gencnt; /* generation count of this instance */
- struct mtx inp_mtx;
+ struct rwlock inp_lock;
#define in6p_faddr inp_inc.inc6_faddr
#define in6p_laddr inp_inc.inc6_laddr
@@ -264,7 +269,7 @@ struct inpcbinfo {
* or freed.
*/
u_quad_t ipi_gencnt;
- struct mtx ipi_mtx;
+ struct rwlock ipi_lock;
/*
* vimage 1
@@ -274,12 +279,16 @@ struct inpcbinfo {
};
#define INP_LOCK_INIT(inp, d, t) \
- mtx_init(&(inp)->inp_mtx, (d), (t), MTX_DEF | MTX_RECURSE | MTX_DUPOK)
-#define INP_LOCK_DESTROY(inp) mtx_destroy(&(inp)->inp_mtx)
-#define INP_LOCK(inp) mtx_lock(&(inp)->inp_mtx)
-#define INP_UNLOCK(inp) mtx_unlock(&(inp)->inp_mtx)
-#define INP_LOCK_ASSERT(inp) mtx_assert(&(inp)->inp_mtx, MA_OWNED)
-#define INP_UNLOCK_ASSERT(inp) mtx_assert(&(inp)->inp_mtx, MA_NOTOWNED)
+ rw_init_flags(&(inp)->inp_lock, (t), RW_RECURSE | RW_DUPOK)
+#define INP_LOCK_DESTROY(inp) rw_destroy(&(inp)->inp_lock)
+#define INP_RLOCK(inp) rw_rlock(&(inp)->inp_lock)
+#define INP_WLOCK(inp) rw_wlock(&(inp)->inp_lock)
+#define INP_RUNLOCK(inp) rw_runlock(&(inp)->inp_lock)
+#define INP_WUNLOCK(inp) rw_wunlock(&(inp)->inp_lock)
+#define INP_LOCK_ASSERT(inp) rw_assert(&(inp)->inp_lock, RA_LOCKED)
+#define INP_RLOCK_ASSERT(inp) rw_assert(&(inp)->inp_lock, RA_RLOCKED)
+#define INP_WLOCK_ASSERT(inp) rw_assert(&(inp)->inp_lock, RA_WLOCKED)
+#define INP_UNLOCK_ASSERT(inp) rw_assert(&(inp)->inp_lock, RA_UNLOCKED)
#ifdef _KERNEL
/*
@@ -311,15 +320,16 @@ inp_unlock_assert(struct inpcb *inp __unused)
#define INP_INFO_LOCK_INIT(ipi, d) \
- mtx_init(&(ipi)->ipi_mtx, (d), NULL, MTX_DEF | MTX_RECURSE)
-#define INP_INFO_LOCK_DESTROY(ipi) mtx_destroy(&(ipi)->ipi_mtx)
-#define INP_INFO_RLOCK(ipi) mtx_lock(&(ipi)->ipi_mtx)
-#define INP_INFO_WLOCK(ipi) mtx_lock(&(ipi)->ipi_mtx)
-#define INP_INFO_RUNLOCK(ipi) mtx_unlock(&(ipi)->ipi_mtx)
-#define INP_INFO_WUNLOCK(ipi) mtx_unlock(&(ipi)->ipi_mtx)
-#define INP_INFO_RLOCK_ASSERT(ipi) mtx_assert(&(ipi)->ipi_mtx, MA_OWNED)
-#define INP_INFO_WLOCK_ASSERT(ipi) mtx_assert(&(ipi)->ipi_mtx, MA_OWNED)
-#define INP_INFO_UNLOCK_ASSERT(ipi) mtx_assert(&(ipi)->ipi_mtx, MA_NOTOWNED)
+ rw_init_flags(&(ipi)->ipi_lock, (d), RW_RECURSE)
+#define INP_INFO_LOCK_DESTROY(ipi) rw_destroy(&(ipi)->ipi_lock)
+#define INP_INFO_RLOCK(ipi) rw_rlock(&(ipi)->ipi_lock)
+#define INP_INFO_WLOCK(ipi) rw_wlock(&(ipi)->ipi_lock)
+#define INP_INFO_RUNLOCK(ipi) rw_runlock(&(ipi)->ipi_lock)
+#define INP_INFO_WUNLOCK(ipi) rw_wunlock(&(ipi)->ipi_lock)
+#define INP_INFO_LOCK_ASSERT(ipi) rw_assert(&(ipi)->ipi_lock, RA_LOCKED)
+#define INP_INFO_RLOCK_ASSERT(ipi) rw_assert(&(ipi)->ipi_lock, RA_RLOCKED)
+#define INP_INFO_WLOCK_ASSERT(ipi) rw_assert(&(ipi)->ipi_lock, RA_WLOCKED)
+#define INP_INFO_UNLOCK_ASSERT(ipi) rw_assert(&(ipi)->ipi_lock, RA_UNLOCKED)
#define INP_PCBHASH(faddr, lport, fport, mask) \
(((faddr) ^ ((faddr) >> 16) ^ ntohs((lport) ^ (fport))) & (mask))
diff --git a/sys/netinet/ip_divert.c b/sys/netinet/ip_divert.c
index ee81288..b2ec79f 100644
--- a/sys/netinet/ip_divert.c
+++ b/sys/netinet/ip_divert.c
@@ -268,7 +268,7 @@ divert_packet(struct mbuf *m, int incoming)
nport = htons((u_int16_t)divert_info(mtag));
INP_INFO_RLOCK(&divcbinfo);
LIST_FOREACH(inp, &divcb, inp_list) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
/* XXX why does only one socket match? */
if (inp->inp_lport == nport) {
sa = inp->inp_socket;
@@ -280,10 +280,10 @@ divert_packet(struct mbuf *m, int incoming)
sa = NULL; /* force mbuf reclaim below */
} else
sorwakeup_locked(sa);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
break;
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
INP_INFO_RUNLOCK(&divcbinfo);
if (sa == NULL) {
@@ -356,7 +356,7 @@ div_output(struct socket *so, struct mbuf *m, struct sockaddr_in *sin,
dt->info |= IP_FW_DIVERT_OUTPUT_FLAG;
INP_INFO_WLOCK(&divcbinfo);
inp = sotoinpcb(so);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
/*
* Don't allow both user specified and setsockopt options,
* and don't allow packet length sizes that will crash
@@ -364,7 +364,7 @@ div_output(struct socket *so, struct mbuf *m, struct sockaddr_in *sin,
if (((ip->ip_hl != (sizeof (*ip) >> 2)) && inp->inp_options) ||
((u_short)ntohs(ip->ip_len) > m->m_pkthdr.len)) {
error = EINVAL;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&divcbinfo);
m_freem(m);
} else {
@@ -405,7 +405,7 @@ div_output(struct socket *so, struct mbuf *m, struct sockaddr_in *sin,
if (options == NULL)
error = ENOBUFS;
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&divcbinfo);
if (error == ENOBUFS) {
m_freem(m);
@@ -480,7 +480,7 @@ div_attach(struct socket *so, int proto, struct thread *td)
inp->inp_ip_p = proto;
inp->inp_vflag |= INP_IPV4;
inp->inp_flags |= INP_HDRINCL;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return 0;
}
@@ -492,7 +492,7 @@ div_detach(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("div_detach: inp == NULL"));
INP_INFO_WLOCK(&divcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
in_pcbdetach(inp);
in_pcbfree(inp);
INP_INFO_WUNLOCK(&divcbinfo);
@@ -517,9 +517,9 @@ div_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
return EAFNOSUPPORT;
((struct sockaddr_in *)nam)->sin_addr.s_addr = INADDR_ANY;
INP_INFO_WLOCK(&divcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
error = in_pcbbind(inp, nam, td->td_ucred);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&divcbinfo);
return error;
}
@@ -531,9 +531,9 @@ div_shutdown(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("div_shutdown: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
socantsendmore(so);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return 0;
}
@@ -615,11 +615,11 @@ div_pcblist(SYSCTL_HANDLER_ARGS)
INP_INFO_RLOCK(&divcbinfo);
for (inp = LIST_FIRST(divcbinfo.ipi_listhead), i = 0; inp && i < n;
inp = LIST_NEXT(inp, inp_list)) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_gencnt <= gencnt &&
cr_canseesocket(req->td->td_ucred, inp->inp_socket) == 0)
inp_list[i++] = inp;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
INP_INFO_RUNLOCK(&divcbinfo);
n = i;
@@ -627,7 +627,7 @@ div_pcblist(SYSCTL_HANDLER_ARGS)
error = 0;
for (i = 0; i < n; i++) {
inp = inp_list[i];
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_gencnt <= gencnt) {
struct xinpcb xi;
bzero(&xi, sizeof(xi));
@@ -636,10 +636,10 @@ div_pcblist(SYSCTL_HANDLER_ARGS)
bcopy(inp, &xi.xi_inp, sizeof *inp);
if (inp->inp_socket)
sotoxsocket(inp->inp_socket, &xi.xi_socket);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = SYSCTL_OUT(req, &xi, sizeof xi);
} else
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
if (!error) {
/*
diff --git a/sys/netinet/ip_fw2.c b/sys/netinet/ip_fw2.c
index a3347e5..428a182 100644
--- a/sys/netinet/ip_fw2.c
+++ b/sys/netinet/ip_fw2.c
@@ -1974,7 +1974,7 @@ check_uidgid(ipfw_insn_u32 *insn, int proto, struct ifnet *oif,
* up the PCB, we can use the one that was supplied.
*/
if (inp && *lookup == 0) {
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if (inp->inp_socket != NULL) {
fill_ugid_cache(inp, ugp);
*lookup = 1;
@@ -2008,12 +2008,12 @@ check_uidgid(ipfw_insn_u32 *insn, int proto, struct ifnet *oif,
dst_ip, htons(dst_port),
wildcard, NULL);
if (pcb != NULL) {
- INP_LOCK(pcb);
+ INP_WLOCK(pcb);
if (pcb->inp_socket != NULL) {
fill_ugid_cache(pcb, ugp);
*lookup = 1;
}
- INP_UNLOCK(pcb);
+ INP_WUNLOCK(pcb);
}
INP_INFO_RUNLOCK(pi);
if (*lookup == 0) {
diff --git a/sys/netinet/ip_options.c b/sys/netinet/ip_options.c
index 6eeec01..72b6edd 100644
--- a/sys/netinet/ip_options.c
+++ b/sys/netinet/ip_options.c
@@ -589,7 +589,7 @@ ip_pcbopts(struct inpcb *inp, int optname, struct mbuf *m)
struct mbuf **pcbopt;
u_char opt;
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
pcbopt = &inp->inp_options;
diff --git a/sys/netinet/ip_output.c b/sys/netinet/ip_output.c
index 7ce2104..5e08dac 100644
--- a/sys/netinet/ip_output.c
+++ b/sys/netinet/ip_output.c
@@ -130,7 +130,7 @@ ip_output(struct mbuf *m, struct mbuf *opt, struct route *ro, int flags,
}
if (inp != NULL)
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if (opt) {
len = 0;
@@ -844,9 +844,9 @@ ip_ctloutput(struct socket *so, struct sockopt *sopt)
m_free(m);
break;
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
error = ip_pcbopts(inp, sopt->sopt_name, m);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (error);
}
@@ -883,12 +883,12 @@ ip_ctloutput(struct socket *so, struct sockopt *sopt)
break;
#define OPTSET(bit) do { \
- INP_LOCK(inp); \
+ INP_WLOCK(inp); \
if (optval) \
inp->inp_flags |= bit; \
else \
inp->inp_flags &= ~bit; \
- INP_UNLOCK(inp); \
+ INP_WUNLOCK(inp); \
} while (0)
case IP_RECVOPTS:
@@ -955,7 +955,7 @@ ip_ctloutput(struct socket *so, struct sockopt *sopt)
if (error)
break;
- INP_LOCK(inp);
+ INP_WLOCK(inp);
switch (optval) {
case IP_PORTRANGE_DEFAULT:
inp->inp_flags &= ~(INP_LOWPORT);
@@ -976,7 +976,7 @@ ip_ctloutput(struct socket *so, struct sockopt *sopt)
error = EINVAL;
break;
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
break;
#ifdef IPSEC
diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c
index f23aaf1..ead5219 100644
--- a/sys/netinet/raw_ip.c
+++ b/sys/netinet/raw_ip.c
@@ -155,7 +155,7 @@ raw_append(struct inpcb *last, struct ip *ip, struct mbuf *n)
{
int policyfail = 0;
- INP_LOCK_ASSERT(last);
+ INP_WLOCK_ASSERT(last);
#ifdef IPSEC
/* check AH/ESP integrity. */
@@ -209,10 +209,10 @@ rip_input(struct mbuf *m, int off)
ripsrc.sin_addr = ip->ip_src;
last = NULL;
LIST_FOREACH(inp, &ripcb, inp_list) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_ip_p && inp->inp_ip_p != proto) {
docontinue:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
continue;
}
#ifdef INET6
@@ -236,14 +236,14 @@ rip_input(struct mbuf *m, int off)
if (n != NULL)
(void) raw_append(last, ip, n);
/* XXX count dropped packet */
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
}
last = inp;
}
if (last != NULL) {
if (raw_append(last, ip, m) != 0)
ipstat.ips_delivered--;
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
} else {
m_freem(m);
ipstat.ips_noproto++;
@@ -278,7 +278,7 @@ rip_output(struct mbuf *m, struct socket *so, u_long dst)
if (m == NULL)
return(ENOBUFS);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
ip = mtod(m, struct ip *);
ip->ip_tos = inp->inp_ip_tos;
if (inp->inp_flags & INP_DONTFRAG)
@@ -299,12 +299,12 @@ rip_output(struct mbuf *m, struct socket *so, u_long dst)
m_freem(m);
return(EMSGSIZE);
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
ip = mtod(m, struct ip *);
if (jailed(inp->inp_socket->so_cred)) {
if (ip->ip_src.s_addr !=
htonl(prison_getip(inp->inp_socket->so_cred))) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
m_freem(m);
return (EPERM);
}
@@ -315,7 +315,7 @@ rip_output(struct mbuf *m, struct socket *so, u_long dst)
&& inp->inp_options)
|| (ip->ip_len > m->m_pkthdr.len)
|| (ip->ip_len < (ip->ip_hl << 2))) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
m_freem(m);
return EINVAL;
}
@@ -335,7 +335,7 @@ rip_output(struct mbuf *m, struct socket *so, u_long dst)
error = ip_output(m, inp->inp_options, NULL, flags,
inp->inp_moptions, inp);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return error;
}
@@ -621,7 +621,7 @@ rip_attach(struct socket *so, int proto, struct thread *td)
inp->inp_vflag |= INP_IPV4;
inp->inp_ip_p = proto;
inp->inp_ip_ttl = ip_defttl;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return 0;
}
@@ -636,7 +636,7 @@ rip_detach(struct socket *so)
("rip_detach: not closed"));
INP_INFO_WLOCK(&ripcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (so == ip_mrouter && ip_mrouter_done)
ip_mrouter_done();
if (ip_rsvp_force_done)
@@ -652,7 +652,7 @@ static void
rip_dodisconnect(struct socket *so, struct inpcb *inp)
{
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
inp->inp_faddr.s_addr = INADDR_ANY;
SOCK_LOCK(so);
@@ -669,9 +669,9 @@ rip_abort(struct socket *so)
KASSERT(inp != NULL, ("rip_abort: inp == NULL"));
INP_INFO_WLOCK(&ripcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
rip_dodisconnect(so, inp);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&ripcbinfo);
}
@@ -684,9 +684,9 @@ rip_close(struct socket *so)
KASSERT(inp != NULL, ("rip_close: inp == NULL"));
INP_INFO_WLOCK(&ripcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
rip_dodisconnect(so, inp);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&ripcbinfo);
}
@@ -701,9 +701,9 @@ rip_disconnect(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("rip_disconnect: inp == NULL"));
INP_INFO_WLOCK(&ripcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
rip_dodisconnect(so, inp);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&ripcbinfo);
return (0);
}
@@ -734,9 +734,9 @@ rip_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("rip_bind: inp == NULL"));
INP_INFO_WLOCK(&ripcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
inp->inp_laddr = addr->sin_addr;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&ripcbinfo);
return 0;
}
@@ -757,10 +757,10 @@ rip_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("rip_connect: inp == NULL"));
INP_INFO_WLOCK(&ripcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
inp->inp_faddr = addr->sin_addr;
soisconnected(so);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&ripcbinfo);
return 0;
}
@@ -772,9 +772,9 @@ rip_shutdown(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("rip_shutdown: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
socantsendmore(so);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return 0;
}
@@ -847,17 +847,17 @@ rip_pcblist(SYSCTL_HANDLER_ARGS)
inp_list = malloc(n * sizeof *inp_list, M_TEMP, M_WAITOK);
if (inp_list == 0)
return ENOMEM;
-
+
INP_INFO_RLOCK(&ripcbinfo);
for (inp = LIST_FIRST(ripcbinfo.ipi_listhead), i = 0; inp && i < n;
inp = LIST_NEXT(inp, inp_list)) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_gencnt <= gencnt &&
cr_canseesocket(req->td->td_ucred, inp->inp_socket) == 0) {
/* XXX held references? */
inp_list[i++] = inp;
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
INP_INFO_RUNLOCK(&ripcbinfo);
n = i;
@@ -865,7 +865,7 @@ rip_pcblist(SYSCTL_HANDLER_ARGS)
error = 0;
for (i = 0; i < n; i++) {
inp = inp_list[i];
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_gencnt <= gencnt) {
struct xinpcb xi;
bzero(&xi, sizeof(xi));
@@ -874,10 +874,10 @@ rip_pcblist(SYSCTL_HANDLER_ARGS)
bcopy(inp, &xi.xi_inp, sizeof *inp);
if (inp->inp_socket)
sotoxsocket(inp->inp_socket, &xi.xi_socket);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = SYSCTL_OUT(req, &xi, sizeof xi);
} else
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
if (!error) {
/*
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
index d7f42867..a344ae5 100644
--- a/sys/netinet/tcp_input.c
+++ b/sys/netinet/tcp_input.c
@@ -476,7 +476,7 @@ findpcb:
rstreason = BANDLIM_RST_CLOSEDPORT;
goto dropwithreset;
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
#ifdef IPSEC
#ifdef INET6
@@ -533,7 +533,7 @@ findpcb:
}
#ifdef MAC
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if (mac_inpcb_check_deliver(inp, m))
goto dropunlock;
#endif
@@ -631,9 +631,9 @@ findpcb:
* Unlock the listen socket, lock the newly
* created socket and update the tp variable.
*/
- INP_UNLOCK(inp); /* listen socket */
+ INP_WUNLOCK(inp); /* listen socket */
inp = sotoinpcb(so);
- INP_LOCK(inp); /* new connection */
+ INP_WLOCK(inp); /* new connection */
tp = intotcpcb(inp);
KASSERT(tp->t_state == TCPS_SYN_RECEIVED,
("%s: ", __func__));
@@ -853,7 +853,7 @@ dropwithreset:
dropunlock:
INP_INFO_WLOCK_ASSERT(&tcbinfo);
if (inp != NULL)
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
drop:
INP_INFO_UNLOCK_ASSERT(&tcbinfo);
@@ -886,7 +886,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
thflags = th->th_flags;
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
KASSERT(tp->t_state > TCPS_LISTEN, ("%s: TCPS_LISTEN",
__func__));
KASSERT(tp->t_state != TCPS_TIME_WAIT, ("%s: TCPS_TIME_WAIT",
@@ -1330,7 +1330,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
KASSERT(headlocked, ("%s: trimthenstep6: head not locked",
__func__));
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
/*
* Advance th->th_seq to correspond to first data byte.
@@ -1938,7 +1938,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
process_ACK:
KASSERT(headlocked, ("%s: process_ACK: head not locked",
__func__));
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
acked = th->th_ack - tp->snd_una;
tcpstat.tcps_rcvackpack++;
@@ -2121,7 +2121,7 @@ process_ACK:
step6:
KASSERT(headlocked, ("%s: step6: head not locked", __func__));
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
/*
* Update window information.
@@ -2207,7 +2207,7 @@ step6:
}
dodata: /* XXX */
KASSERT(headlocked, ("%s: dodata: head not locked", __func__));
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
/*
* Process the segment text, merging it into the TCP sequencing queue,
@@ -2350,12 +2350,12 @@ check_delack:
KASSERT(headlocked == 0, ("%s: check_delack: head locked",
__func__));
INP_INFO_UNLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
if (tp->t_flags & TF_DELACK) {
tp->t_flags &= ~TF_DELACK;
tcp_timer_activate(tp, TT_DELACK, tcp_delacktime);
}
- INP_UNLOCK(tp->t_inpcb);
+ INP_WUNLOCK(tp->t_inpcb);
return;
dropafterack:
@@ -2390,7 +2390,7 @@ dropafterack:
INP_INFO_WUNLOCK(&tcbinfo);
tp->t_flags |= TF_ACKNOW;
(void) tcp_output(tp);
- INP_UNLOCK(tp->t_inpcb);
+ INP_WUNLOCK(tp->t_inpcb);
m_freem(m);
return;
@@ -2400,7 +2400,7 @@ dropwithreset:
tcp_dropwithreset(m, th, tp, tlen, rstreason);
if (tp != NULL)
- INP_UNLOCK(tp->t_inpcb);
+ INP_WUNLOCK(tp->t_inpcb);
if (headlocked)
INP_INFO_WUNLOCK(&tcbinfo);
return;
@@ -2415,7 +2415,7 @@ drop:
&tcp_savetcp, 0);
#endif
if (tp != NULL)
- INP_UNLOCK(tp->t_inpcb);
+ INP_WUNLOCK(tp->t_inpcb);
if (headlocked)
INP_INFO_WUNLOCK(&tcbinfo);
m_freem(m);
@@ -2437,7 +2437,7 @@ tcp_dropwithreset(struct mbuf *m, struct tcphdr *th, struct tcpcb *tp,
#endif
if (tp != NULL) {
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
}
/* Don't bother if destination was broadcast/multicast. */
@@ -2589,7 +2589,7 @@ tcp_pulloutofband(struct socket *so, struct tcphdr *th, struct mbuf *m,
char *cp = mtod(m, caddr_t) + cnt;
struct tcpcb *tp = sototcpcb(so);
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
tp->t_iobc = *cp;
tp->t_oobflags |= TCPOOB_HAVEDATA;
@@ -2616,7 +2616,7 @@ tcp_xmit_timer(struct tcpcb *tp, int rtt)
{
int delta;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
tcpstat.tcps_rttupdated++;
tp->t_rttupdated++;
@@ -2736,7 +2736,7 @@ tcp_mss(struct tcpcb *tp, int offer)
const size_t min_protoh = sizeof(struct tcpiphdr);
#endif
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
/* Initialize. */
#ifdef INET6
@@ -3006,7 +3006,7 @@ tcp_newreno_partial_ack(struct tcpcb *tp, struct tcphdr *th)
tcp_seq onxt = tp->snd_nxt;
u_long ocwnd = tp->snd_cwnd;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
tcp_timer_activate(tp, TT_REXMT, 0);
tp->t_rtttime = 0;
diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c
index 5c659a3..5566ccf 100644
--- a/sys/netinet/tcp_output.c
+++ b/sys/netinet/tcp_output.c
@@ -152,7 +152,7 @@ tcp_output(struct tcpcb *tp)
isipv6 = (tp->t_inpcb->inp_vflag & INP_IPV6) != 0;
#endif
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
/*
* Determine length of data that should be transmitted,
diff --git a/sys/netinet/tcp_reass.c b/sys/netinet/tcp_reass.c
index d011878..1502242 100644
--- a/sys/netinet/tcp_reass.c
+++ b/sys/netinet/tcp_reass.c
@@ -131,7 +131,7 @@ tcp_reass(struct tcpcb *tp, struct tcphdr *th, int *tlenp, struct mbuf *m)
struct socket *so = tp->t_inpcb->inp_socket;
int flags;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
/*
* XXX: tcp_reass() is rather inefficient with its data structures
diff --git a/sys/netinet/tcp_sack.c b/sys/netinet/tcp_sack.c
index aa0849c..0b55a04 100644
--- a/sys/netinet/tcp_sack.c
+++ b/sys/netinet/tcp_sack.c
@@ -160,7 +160,7 @@ tcp_update_sack_list(struct tcpcb *tp, tcp_seq rcv_start, tcp_seq rcv_end)
struct sackblk head_blk, saved_blks[MAX_SACK_BLKS];
int num_head, num_saved, i;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
/* Check arguments. */
KASSERT(SEQ_LT(rcv_start, rcv_end), ("rcv_start < rcv_end"));
@@ -240,7 +240,7 @@ tcp_clean_sackreport(struct tcpcb *tp)
{
int i;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
tp->rcv_numsacks = 0;
for (i = 0; i < MAX_SACK_BLKS; i++)
tp->sackblks[i].start = tp->sackblks[i].end=0;
@@ -347,7 +347,7 @@ tcp_sack_doack(struct tcpcb *tp, struct tcpopt *to, tcp_seq th_ack)
struct sackblk sack, sack_blocks[TCP_MAX_SACK + 1], *sblkp;
int i, j, num_sack_blks;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
num_sack_blks = 0;
/*
@@ -544,7 +544,7 @@ tcp_free_sackholes(struct tcpcb *tp)
{
struct sackhole *q;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
while ((q = TAILQ_FIRST(&tp->snd_holes)) != NULL)
tcp_sackhole_remove(tp, q);
tp->sackhint.sack_bytes_rexmit = 0;
@@ -567,7 +567,7 @@ tcp_sack_partialack(struct tcpcb *tp, struct tcphdr *th)
{
int num_segs = 1;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
tcp_timer_activate(tp, TT_REXMT, 0);
tp->t_rtttime = 0;
/* Send one or 2 segments based on how much new data was acked. */
@@ -591,7 +591,7 @@ tcp_sack_output_debug(struct tcpcb *tp, int *sack_bytes_rexmt)
{
struct sackhole *p;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
*sack_bytes_rexmt = 0;
TAILQ_FOREACH(p, &tp->snd_holes, scblink) {
if (SEQ_LT(p->rxmit, p->end)) {
@@ -629,7 +629,7 @@ tcp_sack_output(struct tcpcb *tp, int *sack_bytes_rexmt)
{
struct sackhole *hole = NULL;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
*sack_bytes_rexmt = tp->sackhint.sack_bytes_rexmit;
hole = tp->sackhint.nexthole;
if (hole == NULL || SEQ_LT(hole->rxmit, hole->end))
@@ -654,7 +654,7 @@ tcp_sack_adjust(struct tcpcb *tp)
{
struct sackhole *p, *cur = TAILQ_FIRST(&tp->snd_holes);
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
if (cur == NULL)
return; /* No holes */
if (SEQ_GEQ(tp->snd_nxt, tp->snd_fack))
diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index 214dc3e..aaac6d6 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -332,7 +332,7 @@ tcpip_fillheaders(struct inpcb *inp, void *ip_ptr, void *tcp_ptr)
{
struct tcphdr *th = (struct tcphdr *)tcp_ptr;
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
#ifdef INET6
if ((inp->inp_vflag & INP_IPV6) != 0) {
@@ -438,7 +438,7 @@ tcp_respond(struct tcpcb *tp, void *ipgen, struct tcphdr *th, struct mbuf *m,
if (tp != NULL) {
inp = tp->t_inpcb;
KASSERT(inp != NULL, ("tcp control block w/o inpcb"));
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
} else
inp = NULL;
@@ -525,7 +525,7 @@ tcp_respond(struct tcpcb *tp, void *ipgen, struct tcphdr *th, struct mbuf *m,
* Packet is associated with a socket, so allow the
* label of the response to reflect the socket label.
*/
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
mac_inpcb_create_mbuf(inp, m);
} else {
/*
@@ -648,7 +648,7 @@ tcp_drop(struct tcpcb *tp, int errno)
struct socket *so = tp->t_inpcb->inp_socket;
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
if (TCPS_HAVERCVDSYN(tp->t_state)) {
tp->t_state = TCPS_CLOSED;
@@ -672,7 +672,7 @@ tcp_discardcb(struct tcpcb *tp)
int isipv6 = (inp->inp_vflag & INP_IPV6) != 0;
#endif /* INET6 */
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
/*
* Make sure that all of our timers are stopped before we
@@ -770,7 +770,7 @@ tcp_close(struct tcpcb *tp)
struct socket *so;
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
/* Notify any offload devices of listener close */
if (tp->t_state == TCPS_LISTEN)
@@ -784,7 +784,7 @@ tcp_close(struct tcpcb *tp)
KASSERT(so->so_state & SS_PROTOREF,
("tcp_close: !SS_PROTOREF"));
inp->inp_vflag &= ~INP_SOCKREF;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
ACCEPT_LOCK();
SOCK_LOCK(so);
so->so_state &= ~SS_PROTOREF;
@@ -815,7 +815,7 @@ tcp_drain(void)
LIST_FOREACH(inpb, tcbinfo.ipi_listhead, inp_list) {
if (inpb->inp_vflag & INP_TIMEWAIT)
continue;
- INP_LOCK(inpb);
+ INP_WLOCK(inpb);
if ((tcpb = intotcpcb(inpb)) != NULL) {
while ((te = LIST_FIRST(&tcpb->t_segq))
!= NULL) {
@@ -827,7 +827,7 @@ tcp_drain(void)
}
tcp_clean_sackreport(tcpb);
}
- INP_UNLOCK(inpb);
+ INP_WUNLOCK(inpb);
}
INP_INFO_RUNLOCK(&tcbinfo);
}
@@ -847,7 +847,7 @@ tcp_notify(struct inpcb *inp, int error)
struct tcpcb *tp;
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if ((inp->inp_vflag & INP_TIMEWAIT) ||
(inp->inp_vflag & INP_DROPPED))
@@ -942,7 +942,7 @@ tcp_pcblist(SYSCTL_HANDLER_ARGS)
INP_INFO_RLOCK(&tcbinfo);
for (inp = LIST_FIRST(tcbinfo.ipi_listhead), i = 0; inp != NULL && i
< n; inp = LIST_NEXT(inp, inp_list)) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_gencnt <= gencnt) {
/*
* XXX: This use of cr_cansee(), introduced with
@@ -961,7 +961,7 @@ tcp_pcblist(SYSCTL_HANDLER_ARGS)
if (error == 0)
inp_list[i++] = inp;
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
INP_INFO_RUNLOCK(&tcbinfo);
n = i;
@@ -969,7 +969,7 @@ tcp_pcblist(SYSCTL_HANDLER_ARGS)
error = 0;
for (i = 0; i < n; i++) {
inp = inp_list[i];
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_gencnt <= gencnt) {
struct xtcpcb xt;
void *inp_ppcb;
@@ -993,10 +993,10 @@ tcp_pcblist(SYSCTL_HANDLER_ARGS)
xt.xt_socket.xso_protocol = IPPROTO_TCP;
}
xt.xt_inp.inp_gencnt = inp->inp_gencnt;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = SYSCTL_OUT(req, &xt, sizeof xt);
} else
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
if (!error) {
@@ -1042,7 +1042,7 @@ tcp_getcred(SYSCTL_HANDLER_ARGS)
error = ENOENT;
goto outunlocked;
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_socket == NULL) {
error = ENOENT;
goto out;
@@ -1052,7 +1052,7 @@ tcp_getcred(SYSCTL_HANDLER_ARGS)
goto out;
cru2x(inp->inp_socket->so_cred, &xuc);
out:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
outunlocked:
INP_INFO_RUNLOCK(&tcbinfo);
if (error == 0)
@@ -1106,7 +1106,7 @@ tcp6_getcred(SYSCTL_HANDLER_ARGS)
error = ENOENT;
goto outunlocked;
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_socket == NULL) {
error = ENOENT;
goto out;
@@ -1116,7 +1116,7 @@ tcp6_getcred(SYSCTL_HANDLER_ARGS)
goto out;
cru2x(inp->inp_socket->so_cred, &xuc);
out:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
outunlocked:
INP_INFO_RUNLOCK(&tcbinfo);
if (error == 0)
@@ -1181,7 +1181,7 @@ tcp_ctlinput(int cmd, struct sockaddr *sa, void *vip)
inp = in_pcblookup_hash(&tcbinfo, faddr, th->th_dport,
ip->ip_src, th->th_sport, 0, NULL);
if (inp != NULL) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (!(inp->inp_vflag & INP_TIMEWAIT) &&
!(inp->inp_vflag & INP_DROPPED) &&
!(inp->inp_socket == NULL)) {
@@ -1230,7 +1230,7 @@ tcp_ctlinput(int cmd, struct sockaddr *sa, void *vip)
}
}
if (inp != NULL)
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
} else {
inc.inc_fport = th->th_dport;
inc.inc_lport = th->th_sport;
@@ -1381,7 +1381,7 @@ tcp_new_isn(struct tcpcb *tp)
u_int32_t md5_buffer[4];
tcp_seq new_isn;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
ISN_LOCK();
/* Seed if this is the first use, reseed if requested. */
@@ -1452,7 +1452,7 @@ tcp_drop_syn_sent(struct inpcb *inp, int errno)
struct tcpcb *tp;
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if ((inp->inp_vflag & INP_TIMEWAIT) ||
(inp->inp_vflag & INP_DROPPED))
@@ -1487,7 +1487,7 @@ tcp_mtudisc(struct inpcb *inp, int errno)
int isipv6;
#endif /* INET6 */
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if ((inp->inp_vflag & INP_TIMEWAIT) ||
(inp->inp_vflag & INP_DROPPED))
return (inp);
@@ -1752,7 +1752,7 @@ tcp_xmit_bandwidth_limit(struct tcpcb *tp, tcp_seq ack_seq)
u_long bwnd;
int save_ticks;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
/*
* If inflight_enable is disabled in the middle of a tcp connection,
@@ -2045,7 +2045,7 @@ sysctl_drop(SYSCTL_HANDLER_ARGS)
break;
}
if (inp != NULL) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & INP_TIMEWAIT) {
/*
* XXXRW: There currently exists a state where an
@@ -2057,15 +2057,15 @@ sysctl_drop(SYSCTL_HANDLER_ARGS)
if (tw != NULL)
tcp_twclose(tw, 0);
else
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
} else if (!(inp->inp_vflag & INP_DROPPED) &&
!(inp->inp_socket->so_options & SO_ACCEPTCONN)) {
tp = intotcpcb(inp);
tp = tcp_drop(tp, ECONNABORTED);
if (tp != NULL)
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
} else
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
} else
error = ESRCH;
INP_INFO_WUNLOCK(&tcbinfo);
diff --git a/sys/netinet/tcp_syncache.c b/sys/netinet/tcp_syncache.c
index a824316..f54c6c9 100644
--- a/sys/netinet/tcp_syncache.c
+++ b/sys/netinet/tcp_syncache.c
@@ -670,7 +670,7 @@ syncache_socket(struct syncache *sc, struct socket *lso, struct mbuf *m)
#endif
inp = sotoinpcb(so);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
/* Insert new socket into PCB hash list. */
inp->inp_inc.inc_isipv6 = sc->sc_inc.inc_isipv6;
@@ -817,13 +817,13 @@ syncache_socket(struct syncache *sc, struct socket *lso, struct mbuf *m)
tp->snd_cwnd = tp->t_maxseg;
tcp_timer_activate(tp, TT_KEEP, tcp_keepinit);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
tcpstat.tcps_accepts++;
return (so);
abort:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
abort2:
if (so != NULL)
soabort(so);
@@ -987,7 +987,7 @@ _syncache_add(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th,
struct syncache scs;
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(inp); /* listen socket */
+ INP_WLOCK_ASSERT(inp); /* listen socket */
KASSERT((th->th_flags & (TH_RST|TH_ACK|TH_SYN)) == TH_SYN,
("%s: unexpected tcp flags", __func__));
@@ -1014,13 +1014,13 @@ _syncache_add(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th,
#ifdef MAC
if (mac_syncache_init(&maclabel) != 0) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
goto done;
} else
mac_syncache_create(maclabel, inp);
#endif
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
/*
diff --git a/sys/netinet/tcp_timer.c b/sys/netinet/tcp_timer.c
index 2a78477..765156e 100644
--- a/sys/netinet/tcp_timer.c
+++ b/sys/netinet/tcp_timer.c
@@ -166,11 +166,11 @@ tcp_timer_delack(void *xtp)
INP_INFO_RUNLOCK(&tcbinfo);
return;
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
INP_INFO_RUNLOCK(&tcbinfo);
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_delack)
|| !callout_active(&tp->t_timers->tt_delack)) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return;
}
callout_deactivate(&tp->t_timers->tt_delack);
@@ -178,7 +178,7 @@ tcp_timer_delack(void *xtp)
tp->t_flags |= TF_ACKNOW;
tcpstat.tcps_delack++;
(void) tcp_output(tp);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
void
@@ -208,11 +208,11 @@ tcp_timer_2msl(void *xtp)
INP_INFO_WUNLOCK(&tcbinfo);
return;
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
tcp_free_sackholes(tp);
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_2msl) ||
!callout_active(&tp->t_timers->tt_2msl)) {
- INP_UNLOCK(tp->t_inpcb);
+ INP_WUNLOCK(tp->t_inpcb);
INP_INFO_WUNLOCK(&tcbinfo);
return;
}
@@ -247,7 +247,7 @@ tcp_timer_2msl(void *xtp)
PRU_SLOWTIMO);
#endif
if (tp != NULL)
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
}
@@ -276,10 +276,10 @@ tcp_timer_keep(void *xtp)
INP_INFO_WUNLOCK(&tcbinfo);
return;
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_keep)
|| !callout_active(&tp->t_timers->tt_keep)) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return;
}
@@ -324,7 +324,7 @@ tcp_timer_keep(void *xtp)
tcp_trace(TA_USER, ostate, tp, (void *)0, (struct tcphdr *)0,
PRU_SLOWTIMO);
#endif
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return;
@@ -338,7 +338,7 @@ dropit:
PRU_SLOWTIMO);
#endif
if (tp != NULL)
- INP_UNLOCK(tp->t_inpcb);
+ INP_WUNLOCK(tp->t_inpcb);
INP_INFO_WUNLOCK(&tcbinfo);
}
@@ -366,10 +366,10 @@ tcp_timer_persist(void *xtp)
INP_INFO_WUNLOCK(&tcbinfo);
return;
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_persist)
|| !callout_active(&tp->t_timers->tt_persist)) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return;
}
@@ -404,7 +404,7 @@ out:
tcp_trace(TA_USER, ostate, tp, NULL, NULL, PRU_SLOWTIMO);
#endif
if (tp != NULL)
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
}
@@ -435,10 +435,10 @@ tcp_timer_rexmt(void * xtp)
INP_INFO_WUNLOCK(&tcbinfo);
return;
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_rexmt)
|| !callout_active(&tp->t_timers->tt_rexmt)) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return;
}
@@ -560,7 +560,7 @@ out:
PRU_SLOWTIMO);
#endif
if (tp != NULL)
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
if (headlocked)
INP_INFO_WUNLOCK(&tcbinfo);
}
diff --git a/sys/netinet/tcp_timewait.c b/sys/netinet/tcp_timewait.c
index 6882642..9d4b6e2 100644
--- a/sys/netinet/tcp_timewait.c
+++ b/sys/netinet/tcp_timewait.c
@@ -186,12 +186,12 @@ tcp_twstart(struct tcpcb *tp)
struct socket *so;
INP_INFO_WLOCK_ASSERT(&tcbinfo); /* tcp_tw_2msl_reset(). */
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if (nolocaltimewait && in_localip(inp->inp_faddr)) {
tp = tcp_close(tp);
if (tp != NULL)
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return;
}
@@ -201,7 +201,7 @@ tcp_twstart(struct tcpcb *tp)
if (tw == NULL) {
tp = tcp_close(tp);
if (tp != NULL)
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return;
}
}
@@ -267,13 +267,13 @@ tcp_twstart(struct tcpcb *tp)
KASSERT(so->so_state & SS_PROTOREF,
("tcp_twstart: !SS_PROTOREF"));
inp->inp_vflag &= ~INP_SOCKREF;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
ACCEPT_LOCK();
SOCK_LOCK(so);
so->so_state &= ~SS_PROTOREF;
sofree(so);
} else
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
#if 0
@@ -328,7 +328,7 @@ tcp_twcheck(struct inpcb *inp, struct tcpopt *to, struct tcphdr *th,
/* tcbinfo lock required for tcp_twclose(), tcp_tw_2msl_reset(). */
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
/*
* XXXRW: Time wait state for inpcb has been recycled, but inpcb is
@@ -441,11 +441,11 @@ tcp_twcheck(struct inpcb *inp, struct tcpopt *to, struct tcphdr *th,
tcp_respond(NULL,
mtod(m, void *), th, m, seq, 0, TH_RST|TH_ACK);
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (0);
drop:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
m_freem(m);
return (0);
}
@@ -469,7 +469,7 @@ tcp_twclose(struct tcptw *tw, int reuse)
KASSERT((inp->inp_vflag & INP_TIMEWAIT), ("tcp_twclose: !timewait"));
KASSERT(intotw(inp) == tw, ("tcp_twclose: inp_ppcb != tw"));
INP_INFO_WLOCK_ASSERT(&tcbinfo); /* tcp_tw_2msl_stop(). */
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
tw->tw_inpcb = NULL;
tcp_tw_2msl_stop(tw);
@@ -486,7 +486,7 @@ tcp_twclose(struct tcptw *tw, int reuse)
*/
if (inp->inp_vflag & INP_SOCKREF) {
inp->inp_vflag &= ~INP_SOCKREF;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
ACCEPT_LOCK();
SOCK_LOCK(so);
KASSERT(so->so_state & SS_PROTOREF,
@@ -499,7 +499,7 @@ tcp_twclose(struct tcptw *tw, int reuse)
* inpcb need to be left around to be handled by
* tcp_usr_detach() later.
*/
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
} else {
#ifdef INET6
@@ -532,7 +532,7 @@ tcp_twrespond(struct tcptw *tw, int flags)
int isipv6 = inp->inp_inc.inc_isipv6;
#endif
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
m = m_gethdr(M_DONTWAIT, MT_DATA);
if (m == NULL)
@@ -615,7 +615,7 @@ tcp_tw_2msl_reset(struct tcptw *tw, int rearm)
{
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(tw->tw_inpcb);
+ INP_WLOCK_ASSERT(tw->tw_inpcb);
if (rearm)
TAILQ_REMOVE(&twq_2msl, tw, tw_2msl);
tw->tw_time = ticks + 2 * tcp_msl;
@@ -640,7 +640,7 @@ tcp_tw_2msl_scan(int reuse)
tw = TAILQ_FIRST(&twq_2msl);
if (tw == NULL || (!reuse && tw->tw_time > ticks))
break;
- INP_LOCK(tw->tw_inpcb);
+ INP_WLOCK(tw->tw_inpcb);
tcp_twclose(tw, reuse);
if (reuse)
return (tw);
diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c
index c19bc0c..6a68337 100644
--- a/sys/netinet/tcp_usrreq.c
+++ b/sys/netinet/tcp_usrreq.c
@@ -160,7 +160,7 @@ tcp_detach(struct socket *so, struct inpcb *inp)
#endif
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
KASSERT(so->so_pcb == inp, ("tcp_detach: so_pcb != inp"));
KASSERT(inp->inp_socket == so, ("tcp_detach: inp_socket != so"));
@@ -201,7 +201,7 @@ tcp_detach(struct socket *so, struct inpcb *inp)
else
#endif
in_pcbdetach(inp);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
} else {
/*
@@ -253,7 +253,7 @@ tcp_usr_detach(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_usr_detach: inp == NULL"));
INP_INFO_WLOCK(&tcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
KASSERT(inp->inp_socket != NULL,
("tcp_usr_detach: inp_socket == NULL"));
tcp_detach(so, inp);
@@ -286,7 +286,7 @@ tcp_usr_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
INP_INFO_WLOCK(&tcbinfo);
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_usr_bind: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = EINVAL;
goto out;
@@ -296,7 +296,7 @@ tcp_usr_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
error = in_pcbbind(inp, nam, td->td_ucred);
out:
TCPDEBUG2(PRU_BIND);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return (error);
@@ -326,7 +326,7 @@ tcp6_usr_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
INP_INFO_WLOCK(&tcbinfo);
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp6_usr_bind: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = EINVAL;
goto out;
@@ -352,7 +352,7 @@ tcp6_usr_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
error = in6_pcbbind(inp, nam, td->td_ucred);
out:
TCPDEBUG2(PRU_BIND);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return (error);
}
@@ -372,7 +372,7 @@ tcp_usr_listen(struct socket *so, int backlog, struct thread *td)
INP_INFO_WLOCK(&tcbinfo);
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_usr_listen: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = EINVAL;
goto out;
@@ -392,7 +392,7 @@ tcp_usr_listen(struct socket *so, int backlog, struct thread *td)
out:
TCPDEBUG2(PRU_LISTEN);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return (error);
}
@@ -409,7 +409,7 @@ tcp6_usr_listen(struct socket *so, int backlog, struct thread *td)
INP_INFO_WLOCK(&tcbinfo);
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp6_usr_listen: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = EINVAL;
goto out;
@@ -432,7 +432,7 @@ tcp6_usr_listen(struct socket *so, int backlog, struct thread *td)
out:
TCPDEBUG2(PRU_LISTEN);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return (error);
}
@@ -469,7 +469,7 @@ tcp_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
INP_INFO_WLOCK(&tcbinfo);
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_usr_connect: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = EINVAL;
goto out;
@@ -481,7 +481,7 @@ tcp_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
error = tcp_output_connect(so, nam);
out:
TCPDEBUG2(PRU_CONNECT);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return (error);
}
@@ -510,7 +510,7 @@ tcp6_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
INP_INFO_WLOCK(&tcbinfo);
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp6_usr_connect: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = EINVAL;
goto out;
@@ -542,7 +542,7 @@ tcp6_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
out:
TCPDEBUG2(PRU_CONNECT);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return (error);
}
@@ -570,7 +570,7 @@ tcp_usr_disconnect(struct socket *so)
INP_INFO_WLOCK(&tcbinfo);
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_usr_disconnect: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = ECONNRESET;
goto out;
@@ -580,7 +580,7 @@ tcp_usr_disconnect(struct socket *so)
tcp_disconnect(tp);
out:
TCPDEBUG2(PRU_DISCONNECT);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return (error);
}
@@ -606,7 +606,7 @@ tcp_usr_accept(struct socket *so, struct sockaddr **nam)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_usr_accept: inp == NULL"));
INP_INFO_RLOCK(&tcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = ECONNABORTED;
goto out;
@@ -624,7 +624,7 @@ tcp_usr_accept(struct socket *so, struct sockaddr **nam)
out:
TCPDEBUG2(PRU_ACCEPT);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_RUNLOCK(&tcbinfo);
if (error == 0)
*nam = in_sockaddr(port, &addr);
@@ -649,7 +649,7 @@ tcp6_usr_accept(struct socket *so, struct sockaddr **nam)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp6_usr_accept: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = ECONNABORTED;
goto out;
@@ -673,7 +673,7 @@ tcp6_usr_accept(struct socket *so, struct sockaddr **nam)
out:
TCPDEBUG2(PRU_ACCEPT);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
if (error == 0) {
if (v4)
*nam = in6_v4mapsin6_sockaddr(port, &addr);
@@ -698,7 +698,7 @@ tcp_usr_shutdown(struct socket *so)
INP_INFO_WLOCK(&tcbinfo);
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = ECONNRESET;
goto out;
@@ -711,7 +711,7 @@ tcp_usr_shutdown(struct socket *so)
out:
TCPDEBUG2(PRU_SHUTDOWN);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return (error);
@@ -730,7 +730,7 @@ tcp_usr_rcvd(struct socket *so, int flags)
TCPDEBUG0;
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_usr_rcvd: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = ECONNRESET;
goto out;
@@ -741,7 +741,7 @@ tcp_usr_rcvd(struct socket *so, int flags)
out:
TCPDEBUG2(PRU_RCVD);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (error);
}
@@ -780,7 +780,7 @@ tcp_usr_send(struct socket *so, int flags, struct mbuf *m,
}
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_usr_send: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
if (control)
m_freem(control);
@@ -899,7 +899,7 @@ tcp_usr_send(struct socket *so, int flags, struct mbuf *m,
out:
TCPDEBUG2((flags & PRUS_OOB) ? PRU_SENDOOB :
((flags & PRUS_EOF) ? PRU_SEND_EOF : PRU_SEND));
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
if (headlocked)
INP_INFO_WUNLOCK(&tcbinfo);
return (error);
@@ -919,7 +919,7 @@ tcp_usr_abort(struct socket *so)
KASSERT(inp != NULL, ("tcp_usr_abort: inp == NULL"));
INP_INFO_WLOCK(&tcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
KASSERT(inp->inp_socket != NULL,
("tcp_usr_abort: inp_socket == NULL"));
@@ -939,7 +939,7 @@ tcp_usr_abort(struct socket *so)
SOCK_UNLOCK(so);
inp->inp_vflag |= INP_SOCKREF;
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
}
@@ -957,7 +957,7 @@ tcp_usr_close(struct socket *so)
KASSERT(inp != NULL, ("tcp_usr_close: inp == NULL"));
INP_INFO_WLOCK(&tcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
KASSERT(inp->inp_socket != NULL,
("tcp_usr_close: inp_socket == NULL"));
@@ -978,7 +978,7 @@ tcp_usr_close(struct socket *so)
SOCK_UNLOCK(so);
inp->inp_vflag |= INP_SOCKREF;
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
}
@@ -995,7 +995,7 @@ tcp_usr_rcvoob(struct socket *so, struct mbuf *m, int flags)
TCPDEBUG0;
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_usr_rcvoob: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = ECONNRESET;
goto out;
@@ -1020,7 +1020,7 @@ tcp_usr_rcvoob(struct socket *so, struct mbuf *m, int flags)
out:
TCPDEBUG2(PRU_RCVOOB);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (error);
}
@@ -1086,7 +1086,7 @@ tcp_connect(struct tcpcb *tp, struct sockaddr *nam, struct thread *td)
int error;
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if (inp->inp_lport == 0) {
error = in_pcbbind(inp, (struct sockaddr *)0, td->td_ucred);
@@ -1141,7 +1141,7 @@ tcp6_connect(struct tcpcb *tp, struct sockaddr *nam, struct thread *td)
int error;
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if (inp->inp_lport == 0) {
error = in6_pcbbind(inp, (struct sockaddr *)0, td->td_ucred);
@@ -1205,7 +1205,7 @@ static void
tcp_fill_info(struct tcpcb *tp, struct tcp_info *ti)
{
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
bzero(ti, sizeof(*ti));
ti->tcpi_state = tp->t_state;
@@ -1239,10 +1239,10 @@ tcp_fill_info(struct tcpcb *tp, struct tcp_info *ti)
* has to revalidate that the connection is still valid for the socket
* option.
*/
-#define INP_LOCK_RECHECK(inp) do { \
- INP_LOCK(inp); \
+#define INP_WLOCK_RECHECK(inp) do { \
+ INP_WLOCK(inp); \
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) { \
- INP_UNLOCK(inp); \
+ INP_WUNLOCK(inp); \
return (ECONNRESET); \
} \
tp = intotcpcb(inp); \
@@ -1259,15 +1259,15 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt)
error = 0;
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_ctloutput: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (sopt->sopt_level != IPPROTO_TCP) {
#ifdef INET6
if (INP_CHECK_SOCKAF(so, AF_INET6)) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = ip6_ctloutput(so, sopt);
} else {
#endif /* INET6 */
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = ip_ctloutput(so, sopt);
#ifdef INET6
}
@@ -1275,7 +1275,7 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt)
return (error);
}
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (ECONNRESET);
}
@@ -1284,29 +1284,29 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt)
switch (sopt->sopt_name) {
#ifdef TCP_SIGNATURE
case TCP_MD5SIG:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyin(sopt, &optval, sizeof optval,
sizeof optval);
if (error)
return (error);
- INP_LOCK_RECHECK(inp);
+ INP_WLOCK_RECHECK(inp);
if (optval > 0)
tp->t_flags |= TF_SIGNATURE;
else
tp->t_flags &= ~TF_SIGNATURE;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
break;
#endif /* TCP_SIGNATURE */
case TCP_NODELAY:
case TCP_NOOPT:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyin(sopt, &optval, sizeof optval,
sizeof optval);
if (error)
return (error);
- INP_LOCK_RECHECK(inp);
+ INP_WLOCK_RECHECK(inp);
switch (sopt->sopt_name) {
case TCP_NODELAY:
opt = TF_NODELAY;
@@ -1323,49 +1323,49 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt)
tp->t_flags |= opt;
else
tp->t_flags &= ~opt;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
break;
case TCP_NOPUSH:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyin(sopt, &optval, sizeof optval,
sizeof optval);
if (error)
return (error);
- INP_LOCK_RECHECK(inp);
+ INP_WLOCK_RECHECK(inp);
if (optval)
tp->t_flags |= TF_NOPUSH;
else {
tp->t_flags &= ~TF_NOPUSH;
error = tcp_output(tp);
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
break;
case TCP_MAXSEG:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyin(sopt, &optval, sizeof optval,
sizeof optval);
if (error)
return (error);
- INP_LOCK_RECHECK(inp);
+ INP_WLOCK_RECHECK(inp);
if (optval > 0 && optval <= tp->t_maxseg &&
optval + 40 >= tcp_minmss)
tp->t_maxseg = optval;
else
error = EINVAL;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
break;
case TCP_INFO:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = EINVAL;
break;
default:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = ENOPROTOOPT;
break;
}
@@ -1377,38 +1377,38 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt)
#ifdef TCP_SIGNATURE
case TCP_MD5SIG:
optval = (tp->t_flags & TF_SIGNATURE) ? 1 : 0;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyout(sopt, &optval, sizeof optval);
break;
#endif
case TCP_NODELAY:
optval = tp->t_flags & TF_NODELAY;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyout(sopt, &optval, sizeof optval);
break;
case TCP_MAXSEG:
optval = tp->t_maxseg;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyout(sopt, &optval, sizeof optval);
break;
case TCP_NOOPT:
optval = tp->t_flags & TF_NOOPT;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyout(sopt, &optval, sizeof optval);
break;
case TCP_NOPUSH:
optval = tp->t_flags & TF_NOPUSH;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyout(sopt, &optval, sizeof optval);
break;
case TCP_INFO:
tcp_fill_info(tp, &ti);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyout(sopt, &ti, sizeof ti);
break;
default:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = ENOPROTOOPT;
break;
}
@@ -1416,7 +1416,7 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt)
}
return (error);
}
-#undef INP_LOCK_RECHECK
+#undef INP_WLOCK_RECHECK
/*
* tcp_sendspace and tcp_recvspace are the default send and receive window
@@ -1484,7 +1484,7 @@ tcp_attach(struct socket *so)
return (ENOBUFS);
}
tp->t_state = TCPS_CLOSED;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return (0);
}
@@ -1504,7 +1504,7 @@ tcp_disconnect(struct tcpcb *tp)
struct socket *so = inp->inp_socket;
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
/*
* Neither tcp_close() nor tcp_drop() should return NULL, as the
@@ -1542,7 +1542,7 @@ tcp_usrclosed(struct tcpcb *tp)
{
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
switch (tp->t_state) {
case TCPS_LISTEN:
diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c
index d55377f..d765899 100644
--- a/sys/netinet/udp_usrreq.c
+++ b/sys/netinet/udp_usrreq.c
@@ -195,7 +195,7 @@ udp_append(struct inpcb *inp, struct ip *ip, struct mbuf *n, int off,
struct sockaddr_in6 udp_in6;
#endif
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
#ifdef IPSEC
/* Check AH/ESP integrity. */
@@ -412,7 +412,7 @@ udp_input(struct mbuf *m, int off)
inp->inp_fport != uh->uh_sport)
continue;
- INP_LOCK(inp);
+ INP_WLOCK(inp);
/*
* Handle socket delivery policy for any-source
@@ -469,7 +469,7 @@ udp_input(struct mbuf *m, int off)
}
}
if (blocked != 0) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
continue;
}
}
@@ -480,7 +480,7 @@ udp_input(struct mbuf *m, int off)
if (n != NULL)
udp_append(last, ip, n, iphlen +
sizeof(struct udphdr), &udp_in);
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
}
last = inp;
/*
@@ -507,7 +507,7 @@ udp_input(struct mbuf *m, int off)
}
udp_append(last, ip, m, iphlen + sizeof(struct udphdr),
&udp_in);
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
INP_INFO_RUNLOCK(&udbinfo);
return;
}
@@ -546,17 +546,17 @@ udp_input(struct mbuf *m, int off)
/*
* Check the minimum TTL for socket.
*/
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_ip_minttl && inp->inp_ip_minttl > ip->ip_ttl)
goto badheadlocked;
udp_append(inp, ip, m, iphlen + sizeof(struct udphdr), &udp_in);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_RUNLOCK(&udbinfo);
return;
badheadlocked:
if (inp)
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_RUNLOCK(&udbinfo);
badunlocked:
m_freem(m);
@@ -570,6 +570,8 @@ struct inpcb *
udp_notify(struct inpcb *inp, int errno)
{
+ INP_WLOCK_ASSERT(inp);
+
inp->inp_socket->so_error = errno;
sorwakeup(inp->inp_socket);
sowwakeup(inp->inp_socket);
@@ -610,11 +612,11 @@ udp_ctlinput(int cmd, struct sockaddr *sa, void *vip)
inp = in_pcblookup_hash(&udbinfo, faddr, uh->uh_dport,
ip->ip_src, uh->uh_sport, 0, NULL);
if (inp != NULL) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_socket != NULL) {
udp_notify(inp, inetctlerrmap[cmd]);
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
INP_INFO_RUNLOCK(&udbinfo);
} else
@@ -672,11 +674,11 @@ udp_pcblist(SYSCTL_HANDLER_ARGS)
INP_INFO_RLOCK(&udbinfo);
for (inp = LIST_FIRST(udbinfo.ipi_listhead), i = 0; inp && i < n;
inp = LIST_NEXT(inp, inp_list)) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_gencnt <= gencnt &&
cr_canseesocket(req->td->td_ucred, inp->inp_socket) == 0)
inp_list[i++] = inp;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
INP_INFO_RUNLOCK(&udbinfo);
n = i;
@@ -684,7 +686,7 @@ udp_pcblist(SYSCTL_HANDLER_ARGS)
error = 0;
for (i = 0; i < n; i++) {
inp = inp_list[i];
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_gencnt <= gencnt) {
struct xinpcb xi;
bzero(&xi, sizeof(xi));
@@ -694,10 +696,10 @@ udp_pcblist(SYSCTL_HANDLER_ARGS)
if (inp->inp_socket)
sotoxsocket(inp->inp_socket, &xi.xi_socket);
xi.xi_inp.inp_gencnt = inp->inp_gencnt;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = SYSCTL_OUT(req, &xi, sizeof xi);
} else
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
if (!error) {
/*
@@ -840,7 +842,7 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr,
unlock_udbinfo = 1;
} else
unlock_udbinfo = 0;
- INP_LOCK(inp);
+ INP_WLOCK(inp);
#ifdef MAC
mac_inpcb_create_mbuf(inp, m);
@@ -971,11 +973,11 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr,
INP_INFO_WUNLOCK(&udbinfo);
error = ip_output(m, inp->inp_options, NULL, ipflags,
inp->inp_moptions, inp);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (error);
release:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
if (unlock_udbinfo)
INP_INFO_WUNLOCK(&udbinfo);
m_freem(m);
@@ -990,13 +992,13 @@ udp_abort(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("udp_abort: inp == NULL"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_faddr.s_addr != INADDR_ANY) {
in_pcbdisconnect(inp);
inp->inp_laddr.s_addr = INADDR_ANY;
soisdisconnected(so);
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
}
@@ -1022,7 +1024,7 @@ udp_attach(struct socket *so, int proto, struct thread *td)
INP_INFO_WUNLOCK(&udbinfo);
inp->inp_vflag |= INP_IPV4;
inp->inp_ip_ttl = ip_defttl;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (0);
}
@@ -1035,9 +1037,9 @@ udp_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("udp_bind: inp == NULL"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
error = in_pcbbind(inp, nam, td->td_ucred);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
return (error);
}
@@ -1050,13 +1052,13 @@ udp_close(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("udp_close: inp == NULL"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_faddr.s_addr != INADDR_ANY) {
in_pcbdisconnect(inp);
inp->inp_laddr.s_addr = INADDR_ANY;
soisdisconnected(so);
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
}
@@ -1070,9 +1072,9 @@ udp_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("udp_connect: inp == NULL"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_faddr.s_addr != INADDR_ANY) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
return (EISCONN);
}
@@ -1082,7 +1084,7 @@ udp_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
error = in_pcbconnect(inp, nam, td->td_ucred);
if (error == 0)
soisconnected(so);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
return (error);
}
@@ -1097,7 +1099,7 @@ udp_detach(struct socket *so)
KASSERT(inp->inp_faddr.s_addr == INADDR_ANY,
("udp_detach: not disconnected"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
in_pcbdetach(inp);
in_pcbfree(inp);
INP_INFO_WUNLOCK(&udbinfo);
@@ -1111,10 +1113,10 @@ udp_disconnect(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("udp_disconnect: inp == NULL"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_faddr.s_addr == INADDR_ANY) {
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
- INP_UNLOCK(inp);
return (ENOTCONN);
}
@@ -1123,7 +1125,7 @@ udp_disconnect(struct socket *so)
SOCK_LOCK(so);
so->so_state &= ~SS_ISCONNECTED; /* XXX */
SOCK_UNLOCK(so);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
return (0);
}
@@ -1146,9 +1148,9 @@ udp_shutdown(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("udp_shutdown: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
socantsendmore(so);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (0);
}
diff --git a/sys/netinet6/icmp6.c b/sys/netinet6/icmp6.c
index ea5a646..7039edd 100644
--- a/sys/netinet6/icmp6.c
+++ b/sys/netinet6/icmp6.c
@@ -1891,10 +1891,10 @@ icmp6_rip6_input(struct mbuf **mp, int off)
INP_INFO_RLOCK(&ripcbinfo);
LIST_FOREACH(in6p, &ripcb, inp_list) {
- INP_LOCK(in6p);
+ INP_WLOCK(in6p);
if ((in6p->inp_vflag & INP_IPV6) == 0) {
docontinue:
- INP_UNLOCK(in6p);
+ INP_WUNLOCK(in6p);
continue;
}
if (in6p->in6p_ip6_nxt != IPPROTO_ICMPV6)
@@ -1965,7 +1965,7 @@ icmp6_rip6_input(struct mbuf **mp, int off)
sorwakeup_locked(last->in6p_socket);
opts = NULL;
}
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
}
last = in6p;
}
@@ -2003,7 +2003,7 @@ icmp6_rip6_input(struct mbuf **mp, int off)
SOCKBUF_UNLOCK(&last->in6p_socket->so_rcv);
} else
sorwakeup_locked(last->in6p_socket);
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
} else {
m_freem(m);
ip6stat.ip6s_delivered--;
diff --git a/sys/netinet6/in6_pcb.c b/sys/netinet6/in6_pcb.c
index a93b45a..9986e69 100644
--- a/sys/netinet6/in6_pcb.c
+++ b/sys/netinet6/in6_pcb.c
@@ -122,7 +122,7 @@ in6_pcbbind(register struct inpcb *inp, struct sockaddr *nam,
int wild = 0, reuseport = (so->so_options & SO_REUSEPORT);
INP_INFO_WLOCK_ASSERT(pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if (!in6_ifaddr) /* XXX broken! */
return (EADDRNOTAVAIL);
@@ -288,7 +288,7 @@ in6_pcbladdr(register struct inpcb *inp, struct sockaddr *nam,
int scope_ambiguous = 0;
INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if (nam->sa_len != sizeof (*sin6))
return (EINVAL);
@@ -354,7 +354,7 @@ in6_pcbconnect(register struct inpcb *inp, struct sockaddr *nam,
int error;
INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
/*
* Call inner routine, to assign local interface address.
@@ -396,7 +396,7 @@ in6_pcbdisconnect(struct inpcb *inp)
{
INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
bzero((caddr_t)&inp->in6p_faddr, sizeof(inp->in6p_faddr));
inp->inp_fport = 0;
@@ -421,7 +421,7 @@ in6_pcbfree(struct inpcb *inp)
KASSERT(inp->inp_socket == NULL, ("in6_pcbfree: inp_socket != NULL"));
INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
#ifdef IPSEC
if (inp->in6p_sp != NULL)
@@ -440,7 +440,7 @@ in6_pcbfree(struct inpcb *inp)
#ifdef MAC
mac_inpcb_destroy(inp);
#endif
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
uma_zfree(ipi->ipi_zone, inp);
}
@@ -489,10 +489,10 @@ in6_getsockaddr(struct socket *so, struct sockaddr **nam)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("in6_getsockaddr: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
port = inp->inp_lport;
addr = inp->in6p_laddr;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
*nam = in6_sockaddr(port, &addr);
return 0;
@@ -508,10 +508,10 @@ in6_getpeeraddr(struct socket *so, struct sockaddr **nam)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("in6_getpeeraddr: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
port = inp->inp_fport;
addr = inp->in6p_faddr;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
*nam = in6_sockaddr(port, &addr);
return 0;
@@ -611,9 +611,9 @@ in6_pcbnotify(struct inpcbinfo *pcbinfo, struct sockaddr *dst,
errno = inet6ctlerrmap[cmd];
INP_INFO_WLOCK(pcbinfo);
LIST_FOREACH_SAFE(inp, pcbinfo->ipi_listhead, inp_list, inp_temp) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if ((inp->inp_vflag & INP_IPV6) == 0) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
continue;
}
@@ -654,16 +654,16 @@ in6_pcbnotify(struct inpcbinfo *pcbinfo, struct sockaddr *dst,
!IN6_ARE_ADDR_EQUAL(&inp->in6p_laddr,
&sa6_src.sin6_addr)) ||
(fport && inp->inp_fport != fport)) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
continue;
}
do_notify:
if (notify) {
if ((*notify)(inp, errno))
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
} else
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
INP_INFO_WUNLOCK(pcbinfo);
}
@@ -765,7 +765,7 @@ in6_pcbpurgeif0(struct inpcbinfo *pcbinfo, struct ifnet *ifp)
INP_INFO_RLOCK(pcbinfo);
LIST_FOREACH(in6p, pcbinfo->ipi_listhead, inp_list) {
- INP_LOCK(in6p);
+ INP_WLOCK(in6p);
im6o = in6p->in6p_moptions;
if ((in6p->inp_vflag & INP_IPV6) &&
im6o) {
@@ -792,7 +792,7 @@ in6_pcbpurgeif0(struct inpcbinfo *pcbinfo, struct ifnet *ifp)
}
}
}
- INP_UNLOCK(in6p);
+ INP_WUNLOCK(in6p);
}
INP_INFO_RUNLOCK(pcbinfo);
}
@@ -839,7 +839,7 @@ in6_pcblookup_hash(struct inpcbinfo *pcbinfo, struct in6_addr *faddr,
u_short fport = fport_arg, lport = lport_arg;
int faith;
- INP_INFO_RLOCK_ASSERT(pcbinfo);
+ INP_INFO_LOCK_ASSERT(pcbinfo);
if (faithprefix_p != NULL)
faith = (*faithprefix_p)(laddr);
diff --git a/sys/netinet6/in6_src.c b/sys/netinet6/in6_src.c
index eeba82b..b6e2856 100644
--- a/sys/netinet6/in6_src.c
+++ b/sys/netinet6/in6_src.c
@@ -763,7 +763,7 @@ in6_pcbsetport(struct in6_addr *laddr, struct inpcb *inp, struct ucred *cred)
struct inpcbinfo *pcbinfo = inp->inp_pcbinfo;
INP_INFO_WLOCK_ASSERT(pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
/* XXX: this is redundant when called from in6_pcbbind */
if ((so->so_options & (SO_REUSEADDR|SO_REUSEPORT)) == 0)
diff --git a/sys/netinet6/raw_ip6.c b/sys/netinet6/raw_ip6.c
index 30fcbea..c12bde1 100644
--- a/sys/netinet6/raw_ip6.c
+++ b/sys/netinet6/raw_ip6.c
@@ -154,10 +154,10 @@ rip6_input(struct mbuf **mp, int *offp, int proto)
INP_INFO_RLOCK(&ripcbinfo);
LIST_FOREACH(in6p, &ripcb, inp_list) {
- INP_LOCK(in6p);
+ INP_WLOCK(in6p);
if ((in6p->in6p_vflag & INP_IPV6) == 0) {
docontinue:
- INP_UNLOCK(in6p);
+ INP_WUNLOCK(in6p);
continue;
}
if (in6p->in6p_ip6_nxt &&
@@ -207,7 +207,7 @@ docontinue:
sorwakeup(last->in6p_socket);
opts = NULL;
}
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
}
last = in6p;
}
@@ -220,7 +220,7 @@ docontinue:
ipsec6stat.in_polvio++;
ip6stat.ip6s_delivered--;
/* do not inject data into pcb */
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
} else
#endif /* IPSEC */
if (last) {
@@ -237,7 +237,7 @@ docontinue:
rip6stat.rip6s_fullsock++;
} else
sorwakeup(last->in6p_socket);
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
} else {
rip6stat.rip6s_nosock++;
if (m->m_flags & M_MCAST)
@@ -335,7 +335,7 @@ rip6_output(m, va_alist)
va_end(ap);
in6p = sotoin6pcb(so);
- INP_LOCK(in6p);
+ INP_WLOCK(in6p);
dst = &dstsock->sin6_addr;
if (control) {
@@ -465,7 +465,7 @@ rip6_output(m, va_alist)
ip6_clearpktopts(&opt, -1);
m_freem(control);
}
- INP_UNLOCK(in6p);
+ INP_WUNLOCK(in6p);
return (error);
}
@@ -569,7 +569,7 @@ rip6_attach(struct socket *so, int proto, struct thread *td)
inp->in6p_cksum = -1;
inp->in6p_icmp6filt = filter;
ICMP6_FILTER_SETPASSALL(inp->in6p_icmp6filt);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return 0;
}
@@ -585,7 +585,7 @@ rip6_detach(struct socket *so)
ip6_mrouter_done();
/* xxx: RSVP */
INP_INFO_WLOCK(&ripcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->in6p_icmp6filt) {
FREE(inp->in6p_icmp6filt, M_PCB);
inp->in6p_icmp6filt = NULL;
@@ -656,9 +656,9 @@ rip6_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
return (EADDRNOTAVAIL);
}
INP_INFO_WLOCK(&ripcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
inp->in6p_laddr = addr->sin6_addr;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&ripcbinfo);
return 0;
}
@@ -694,13 +694,13 @@ rip6_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
return(error);
INP_INFO_WLOCK(&ripcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
/* Source address selection. XXX: need pcblookup? */
in6a = in6_selectsrc(addr, inp->in6p_outputopts,
inp->in6p_moptions, NULL,
&inp->in6p_laddr, &ifp, &error);
if (in6a == NULL) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&ripcbinfo);
return (error ? error : EADDRNOTAVAIL);
}
@@ -708,14 +708,14 @@ rip6_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
/* XXX: see above */
if (ifp && scope_ambiguous &&
(error = in6_setscope(&addr->sin6_addr, ifp, NULL)) != 0) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&ripcbinfo);
return(error);
}
inp->in6p_faddr = addr->sin6_addr;
inp->in6p_laddr = *in6a;
soisconnected(so);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&ripcbinfo);
return 0;
}
@@ -727,9 +727,9 @@ rip6_shutdown(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("rip6_shutdown: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
socantsendmore(so);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return 0;
}
diff --git a/sys/netinet6/udp6_usrreq.c b/sys/netinet6/udp6_usrreq.c
index 803e32d..b019ca7 100644
--- a/sys/netinet6/udp6_usrreq.c
+++ b/sys/netinet6/udp6_usrreq.c
@@ -129,7 +129,7 @@ udp6_append(struct inpcb *inp, struct mbuf *n, int off,
struct socket *so;
struct mbuf *opts;
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
#ifdef IPSEC
/* Check AH/ESP integrity. */
@@ -277,9 +277,9 @@ udp6_input(struct mbuf **mp, int *offp, int proto)
struct mbuf *n;
if ((n = m_copy(m, 0, M_COPYALL)) != NULL) {
- INP_LOCK(last);
+ INP_WLOCK(last);
udp6_append(last, n, off, &fromsa);
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
}
}
last = inp;
@@ -306,9 +306,9 @@ udp6_input(struct mbuf **mp, int *offp, int proto)
udpstat.udps_noportmcast++;
goto badheadlocked;
}
- INP_LOCK(last);
+ INP_WLOCK(last);
udp6_append(last, m, off, &fromsa);
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
INP_INFO_RUNLOCK(&udbinfo);
return (IPPROTO_DONE);
}
@@ -343,9 +343,9 @@ udp6_input(struct mbuf **mp, int *offp, int proto)
icmp6_error(m, ICMP6_DST_UNREACH, ICMP6_DST_UNREACH_NOPORT, 0);
return (IPPROTO_DONE);
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
udp6_append(inp, m, off, &fromsa);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_RUNLOCK(&udbinfo);
return (IPPROTO_DONE);
@@ -453,7 +453,7 @@ udp6_getcred(SYSCTL_HANDLER_ARGS)
INP_INFO_RUNLOCK(&udbinfo);
return (ENOENT);
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_socket == NULL) {
error = ENOENT;
goto out;
@@ -463,7 +463,7 @@ udp6_getcred(SYSCTL_HANDLER_ARGS)
goto out;
cru2x(inp->inp_socket->so_cred, &xuc);
out:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_RUNLOCK(&udbinfo);
if (error == 0)
error = SYSCTL_OUT(req, &xuc, sizeof(struct xucred));
@@ -492,7 +492,7 @@ udp6_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr6,
int flags;
struct sockaddr_in6 tmp;
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if (addr6) {
/* addr6 has been validated in udp6_send(). */
@@ -708,13 +708,13 @@ udp6_abort(struct socket *so)
#endif
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (!IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_faddr)) {
in6_pcbdisconnect(inp);
inp->in6p_laddr = in6addr_any;
soisdisconnected(so);
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
}
@@ -752,7 +752,7 @@ udp6_attach(struct socket *so, int proto, struct thread *td)
* which may match an IPv4-mapped IPv6 address.
*/
inp->inp_ip_ttl = ip_defttl;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (0);
}
@@ -766,7 +766,7 @@ udp6_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
KASSERT(inp != NULL, ("udp6_bind: inp == NULL"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
inp->inp_vflag &= ~INP_IPV4;
inp->inp_vflag |= INP_IPV6;
if ((inp->inp_flags & IN6P_IPV6_V6ONLY) == 0) {
@@ -790,7 +790,7 @@ udp6_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
error = in6_pcbbind(inp, nam, td->td_ucred);
out:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
return (error);
}
@@ -813,13 +813,13 @@ udp6_close(struct socket *so)
}
#endif
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (!IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_faddr)) {
in6_pcbdisconnect(inp);
inp->in6p_laddr = in6addr_any;
soisdisconnected(so);
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
}
@@ -833,7 +833,7 @@ udp6_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
KASSERT(inp != NULL, ("udp6_connect: inp == NULL"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if ((inp->inp_flags & IN6P_IPV6_V6ONLY) == 0) {
struct sockaddr_in6 *sin6_p;
@@ -870,7 +870,7 @@ udp6_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
soisconnected(so);
}
out:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
return (error);
}
@@ -884,7 +884,7 @@ udp6_detach(struct socket *so)
KASSERT(inp != NULL, ("udp6_detach: inp == NULL"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
in6_pcbdetach(inp);
in6_pcbfree(inp);
INP_INFO_WUNLOCK(&udbinfo);
@@ -900,7 +900,7 @@ udp6_disconnect(struct socket *so)
KASSERT(inp != NULL, ("udp6_disconnect: inp == NULL"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
#ifdef INET
if (inp->inp_vflag & INP_IPV4) {
@@ -922,7 +922,7 @@ udp6_disconnect(struct socket *so)
/* XXXRW: so_state locking? */
so->so_state &= ~SS_ISCONNECTED; /* XXX */
out:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
return (0);
}
@@ -938,7 +938,7 @@ udp6_send(struct socket *so, int flags, struct mbuf *m,
KASSERT(inp != NULL, ("udp6_send: inp == NULL"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (addr) {
if (addr->sa_len != sizeof(struct sockaddr_in6)) {
error = EINVAL;
@@ -991,12 +991,12 @@ udp6_send(struct socket *so, int flags, struct mbuf *m,
#endif
error = udp6_output(inp, m, addr, control, td);
out:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
return (error);
bad:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
m_freem(m);
return (error);
diff --git a/sys/security/audit/audit_arg.c b/sys/security/audit/audit_arg.c
index 309b90d..ffdfde6 100644
--- a/sys/security/audit/audit_arg.c
+++ b/sys/security/audit/audit_arg.c
@@ -649,7 +649,7 @@ audit_arg_file(struct proc *p, struct file *fp)
so->so_proto->pr_protocol;
SOCK_UNLOCK(so);
pcb = (struct inpcb *)so->so_pcb;
- INP_LOCK(pcb);
+ INP_WLOCK(pcb);
ar->k_ar.ar_arg_sockinfo.so_raddr =
pcb->inp_faddr.s_addr;
ar->k_ar.ar_arg_sockinfo.so_laddr =
@@ -658,7 +658,7 @@ audit_arg_file(struct proc *p, struct file *fp)
pcb->inp_fport;
ar->k_ar.ar_arg_sockinfo.so_lport =
pcb->inp_lport;
- INP_UNLOCK(pcb);
+ INP_WUNLOCK(pcb);
ARG_SET_VALID(ar, ARG_SOCKINFO);
}
break;
diff --git a/sys/security/mac/mac_inet.c b/sys/security/mac/mac_inet.c
index 6533cf0..0445d91 100644
--- a/sys/security/mac/mac_inet.c
+++ b/sys/security/mac/mac_inet.c
@@ -201,7 +201,7 @@ mac_inpcb_create_mbuf(struct inpcb *inp, struct mbuf *m)
{
struct label *mlabel;
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
mlabel = mac_mbuf_to_label(m);
MAC_PERFORM(inpcb_create_mbuf, inp, inp->inp_label, m, mlabel);
@@ -306,7 +306,7 @@ void
mac_inpcb_sosetlabel(struct socket *so, struct inpcb *inp)
{
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
SOCK_LOCK_ASSERT(so);
MAC_PERFORM(inpcb_sosetlabel, so, so->so_label, inp, inp->inp_label);
}
@@ -376,7 +376,7 @@ void
mac_syncache_create(struct label *label, struct inpcb *inp)
{
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
MAC_PERFORM(syncache_create, label, inp);
}
OpenPOWER on IntegriCloud