From 8501a69cc940a7d32d9299da26baf0b1863e0fa9 Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Thu, 17 Apr 2008 21:38:18 +0000 Subject: [PATCH] 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) --- sys/contrib/pf/net/pf.c | 8 +- sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c | 4 +- sys/kern/subr_witness.c | 10 +- sys/netinet/in_mcast.c | 56 +++++----- sys/netinet/in_pcb.c | 71 +++++++------ sys/netinet/in_pcb.h | 44 ++++---- sys/netinet/ip_divert.c | 34 +++---- sys/netinet/ip_fw2.c | 6 +- sys/netinet/ip_options.c | 2 +- sys/netinet/ip_output.c | 14 +-- sys/netinet/raw_ip.c | 62 +++++------ sys/netinet/tcp_input.c | 40 ++++---- sys/netinet/tcp_output.c | 2 +- sys/netinet/tcp_reass.c | 2 +- sys/netinet/tcp_sack.c | 16 +-- sys/netinet/tcp_subr.c | 58 +++++------ sys/netinet/tcp_syncache.c | 12 +-- sys/netinet/tcp_timer.c | 32 +++--- sys/netinet/tcp_timewait.c | 28 ++--- sys/netinet/tcp_usrreq.c | 136 ++++++++++++------------- sys/netinet/udp_usrreq.c | 70 ++++++------- sys/netinet6/icmp6.c | 8 +- sys/netinet6/in6_pcb.c | 36 +++---- sys/netinet6/in6_src.c | 2 +- sys/netinet6/raw_ip6.c | 34 +++---- sys/netinet6/udp6_usrreq.c | 50 ++++----- sys/security/audit/audit_arg.c | 4 +- sys/security/mac/mac_inet.c | 6 +- 28 files changed, 434 insertions(+), 413 deletions(-) diff --git a/sys/contrib/pf/net/pf.c b/sys/contrib/pf/net/pf.c index 69a7de5ef81b..69fe3de830fc 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 2ad452095ab3..2f9a92eefa2c 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 da114f1e2e49..f54e0875ee0e 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 34e79164e63e..be2208a0a58c 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 f6a45cb3f650..d13418f160cb 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 2bdfb4e1e200..afb4dd2708f7 100644 --- a/sys/netinet/in_pcb.h +++ b/sys/netinet/in_pcb.h @@ -36,9 +36,14 @@ #include #include #include +#include #include +#ifdef _KERNEL +#include +#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 ee8128875909..b2ec79f47043 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 a3347e55d77c..428a18249d78 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 6eeec01748fc..72b6edd98761 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 7ce21045d8bd..5e08dac68009 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 f23aaf1a64f2..ead521978c18 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 d7f428673058..a344ae50c527 100644 --- a/sys/netinet/tcp_input.c +++ b/sys/netinet/tcp_input.c @@ -476,7 +476,7 @@ tcp_input(struct mbuf *m, int off0) rstreason = BANDLIM_RST_CLOSEDPORT; goto dropwithreset; } - INP_LOCK(inp); + INP_WLOCK(inp); #ifdef IPSEC #ifdef INET6 @@ -533,7 +533,7 @@ tcp_input(struct mbuf *m, int off0) } #ifdef MAC - INP_LOCK_ASSERT(inp); + INP_WLOCK_ASSERT(inp); if (mac_inpcb_check_deliver(inp, m)) goto dropunlock; #endif @@ -631,9 +631,9 @@ tcp_input(struct mbuf *m, int off0) * 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 @@ tcp_input(struct mbuf *m, int off0) 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 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so, 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 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so, } 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 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so, 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 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so, 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 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so, 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 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so, &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 5c659a3bc1ee..5566ccf41170 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 d011878e4b83..15022424292d 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 aa0849ccf94e..0b55a0406f6d 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 214dc3e4b247..aaac6d66e47b 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 a824316089e3..f54c6c9cc5d4 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 2a7847710e44..765156eeaaf3 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 @@ tcp_timer_keep(void *xtp) 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 @@ tcp_timer_persist(void *xtp) 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 @@ tcp_timer_rexmt(void * xtp) 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 68826424c31c..9d4b6e23e885 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 c19bc0ca0137..6a68337aa363 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 d55377f4c2ac..d7658996e4f2 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 ea5a646c6141..7039edd94f5a 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 a93b45a191c0..9986e69e40fc 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 eeba82bd3f07..b6e28567a339 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 30fcbeaf09db..c12bde1334c2 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 @@ rip6_input(struct mbuf **mp, int *offp, int proto) sorwakeup(last->in6p_socket); opts = NULL; } - INP_UNLOCK(last); + INP_WUNLOCK(last); } last = in6p; } @@ -220,7 +220,7 @@ rip6_input(struct mbuf **mp, int *offp, int proto) 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 @@ rip6_input(struct mbuf **mp, int *offp, int proto) 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 803e32d192ee..b019ca7da97a 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 309b90d46dbb..ffdfde6c1909 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 6533cf0927cb..0445d915a82e 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); }