--- //depot/projects/netperf/sys/netinet/in_pcb.c 2003/10/31 12:08:38 +++ //depot/user/rwatson/netperf/sys/netinet/in_pcb.c 2003/10/31 22:00:13 @@ -165,6 +165,7 @@ #ifdef IPSEC int error; #endif + INP_INFO_WASSERT(pcbinfo); inp = uma_zalloc(pcbinfo->ipi_zone, M_NOWAIT | M_ZERO); if (inp == NULL) return (ENOBUFS); @@ -204,6 +205,7 @@ { int anonport, error; + INP_INFO_WASSERT(inp->inp_pcbinfo); if (inp->inp_lport != 0 || inp->inp_laddr.s_addr != INADDR_ANY) return (EINVAL); anonport = inp->inp_lport == 0 && (nam == NULL || @@ -248,6 +250,7 @@ int wild = 0, reuseport = (so->so_options & SO_REUSEPORT); int error, prison = 0; + INP_INFO_WASSERT(pcbinfo); if (TAILQ_EMPTY(&in_ifaddrhead)) /* XXX broken! */ return (EADDRNOTAVAIL); laddr.s_addr = *laddrp; @@ -915,6 +918,7 @@ int matchwild = 3, wildcard; u_short lport = lport_arg; + INP_INFO_RASSERT(pcbinfo); if (!wild_okay) { struct inpcbhead *head; /* @@ -1007,6 +1011,7 @@ register struct inpcb *inp; u_short fport = fport_arg, lport = lport_arg; + INP_INFO_RASSERT(pcbinfo); /* * First look for an exact match. */ @@ -1082,6 +1087,7 @@ struct inpcbport *phd; u_int32_t hashkey_faddr; + INP_INFO_WASSERT(pcbinfo); #ifdef INET6 if (inp->inp_vflag & INP_IPV6) hashkey_faddr = inp->in6p_faddr.s6_addr32[3] /* XXX */; @@ -1130,9 +1136,11 @@ in_pcbrehash(inp) struct inpcb *inp; { + struct inpcbinfo *pcbinfo = inp->inp_pcbinfo; struct inpcbhead *head; u_int32_t hashkey_faddr; + INP_INFO_WASSERT(pcbinfo); #ifdef INET6 if (inp->inp_vflag & INP_IPV6) hashkey_faddr = inp->in6p_faddr.s6_addr32[3] /* XXX */; @@ -1140,8 +1148,8 @@ #endif /* INET6 */ hashkey_faddr = inp->inp_faddr.s_addr; - head = &inp->inp_pcbinfo->hashbase[INP_PCBHASH(hashkey_faddr, - inp->inp_lport, inp->inp_fport, inp->inp_pcbinfo->hashmask)]; + head = &pcbinfo->hashbase[INP_PCBHASH(hashkey_faddr, + inp->inp_lport, inp->inp_fport, pcbinfo->hashmask)]; LIST_REMOVE(inp, inp_hash); LIST_INSERT_HEAD(head, inp, inp_hash); @@ -1154,7 +1162,10 @@ in_pcbremlists(inp) struct inpcb *inp; { - inp->inp_gencnt = ++inp->inp_pcbinfo->ipi_gencnt; + struct inpcbinfo *pcbinfo = inp->inp_pcbinfo; + + INP_INFO_WASSERT(pcbinfo); + inp->inp_gencnt = ++pcbinfo->ipi_gencnt; if (inp->inp_lport) { struct inpcbport *phd = inp->inp_phd; @@ -1166,7 +1177,7 @@ } } LIST_REMOVE(inp, inp_list); - inp->inp_pcbinfo->ipi_count--; + pcbinfo->ipi_count--; } int --- //depot/projects/netperf/sys/netinet/in_pcb.h 2003/10/27 09:40:43 +++ //depot/user/rwatson/netperf/sys/netinet/in_pcb.h 2003/10/29 08:02:14 @@ -251,6 +251,7 @@ #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_INFO_LOCK_INIT(ipi, d) \ mtx_init(&(ipi)->ipi_mtx, (d), NULL, MTX_DEF | MTX_RECURSE) @@ -258,6 +259,8 @@ #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_RASSERT(ipi) mtx_assert(&(ipi)->ipi_mtx, MA_OWNED) +#define INP_INFO_WASSERT(ipi) mtx_assert(&(ipi)->ipi_mtx, MA_OWNED) #define INP_PCBHASH(faddr, lport, fport, mask) \ (((faddr) ^ ((faddr) >> 16) ^ ntohs((lport) ^ (fport))) & (mask))