Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 4 Nov 2003 17:47:20 -0800 (PST)
From:      Sam Leffler <sam@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 41401 for review
Message-ID:  <200311050147.hA51lKHH098295@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=41401

Change 41401 by sam@sam_ebb on 2003/11/04 17:46:20

	first round of inpcb locking assertions

Affected files ...

.. //depot/projects/netperf/sys/netinet/in_pcb.c#12 edit
.. //depot/projects/netperf/sys/netinet/in_pcb.h#11 edit

Differences ...

==== //depot/projects/netperf/sys/netinet/in_pcb.c#12 (text+ko) ====

@@ -164,6 +164,7 @@
 #if defined(IPSEC) || defined(FAST_IPSEC)
 	int error;
 #endif
+	INP_INFO_WLOCK_ASSERT(pcbinfo);
 	inp = uma_zalloc(pcbinfo->ipi_zone, M_NOWAIT | M_ZERO);
 	if (inp == NULL)
 		return (ENOBUFS);
@@ -207,6 +208,9 @@
 {
 	int anonport, error;
 
+	INP_LOCK_ASSERT(inp);
+
+	INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
 	if (inp->inp_lport != 0 || inp->inp_laddr.s_addr != INADDR_ANY)
 		return (EINVAL);
 	anonport = inp->inp_lport == 0 && (nam == NULL ||
@@ -251,6 +255,9 @@
 	int wild = 0, reuseport = (so->so_options & SO_REUSEPORT);
 	int error, prison = 0;
 
+	INP_LOCK_ASSERT(inp);
+
+	INP_INFO_WLOCK_ASSERT(pcbinfo);
 	if (TAILQ_EMPTY(&in_ifaddrhead)) /* XXX broken! */
 		return (EADDRNOTAVAIL);
 	laddr.s_addr = *laddrp;
@@ -656,6 +663,7 @@
 in_pcbdisconnect(inp)
 	struct inpcb *inp;
 {
+	INP_LOCK_ASSERT(inp);
 
 	inp->inp_faddr.s_addr = INADDR_ANY;
 	inp->inp_fport = 0;
@@ -674,6 +682,8 @@
 	struct socket *so = inp->inp_socket;
 	struct inpcbinfo *ipi = inp->inp_pcbinfo;
 
+	INP_LOCK_ASSERT(inp);
+
 #if defined(IPSEC) || defined(FAST_IPSEC)
 	ipsec4_delete_pcbpolicy(inp);
 #endif /*IPSEC*/
@@ -872,6 +882,8 @@
 	register struct rtentry *rt;
 	struct rt_addrinfo info;
 
+	INP_LOCK_ASSERT(inp);
+
 	if ((rt = inp->inp_route.ro_rt)) {
 		RT_LOCK(rt);
 		inp->inp_route.ro_rt = NULL;
@@ -900,6 +912,8 @@
 	register struct inpcb *inp;
 	int errno;
 {
+	INP_LOCK_ASSERT(inp);
+
 	if (inp->inp_route.ro_rt) {
 		RTFREE(inp->inp_route.ro_rt);
 		inp->inp_route.ro_rt = 0;
@@ -925,6 +939,7 @@
 	int matchwild = 3, wildcard;
 	u_short lport = lport_arg;
 
+	INP_INFO_RLOCK_ASSERT(pcbinfo);
 	if (!wild_okay) {
 		struct inpcbhead *head;
 		/*
@@ -1029,6 +1044,7 @@
 	register struct inpcb *inp;
 	u_short fport = fport_arg, lport = lport_arg;
 
+	INP_INFO_RLOCK_ASSERT(pcbinfo);
 	/*
 	 * First look for an exact match.
 	 */
@@ -1104,6 +1120,7 @@
 	struct inpcbport *phd;
 	u_int32_t hashkey_faddr;
 
+	INP_INFO_WLOCK_ASSERT(pcbinfo);
 #ifdef INET6
 	if (inp->inp_vflag & INP_IPV6)
 		hashkey_faddr = inp->in6p_faddr.s6_addr32[3] /* XXX */;
@@ -1152,9 +1169,12 @@
 in_pcbrehash(inp)
 	struct inpcb *inp;
 {
+	struct inpcbinfo *pcbinfo = inp->inp_pcbinfo;
 	struct inpcbhead *head;
 	u_int32_t hashkey_faddr;
 
+	INP_INFO_WLOCK_ASSERT(pcbinfo);
+	/* XXX? INP_LOCK_ASSERT(inp); */
 #ifdef INET6
 	if (inp->inp_vflag & INP_IPV6)
 		hashkey_faddr = inp->in6p_faddr.s6_addr32[3] /* XXX */;
@@ -1162,8 +1182,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);
@@ -1176,7 +1196,12 @@
 in_pcbremlists(inp)
 	struct inpcb *inp;
 {
-	inp->inp_gencnt = ++inp->inp_pcbinfo->ipi_gencnt;
+	struct inpcbinfo *pcbinfo = inp->inp_pcbinfo;
+
+	INP_INFO_WLOCK_ASSERT(pcbinfo);
+	INP_LOCK_ASSERT(inp);
+
+	inp->inp_gencnt = ++pcbinfo->ipi_gencnt;
 	if (inp->inp_lport) {
 		struct inpcbport *phd = inp->inp_phd;
 
@@ -1188,7 +1213,7 @@
 		}
 	}
 	LIST_REMOVE(inp, inp_list);
-	inp->inp_pcbinfo->ipi_count--;
+	pcbinfo->ipi_count--;
 }
 
 int

==== //depot/projects/netperf/sys/netinet/in_pcb.h#11 (text+ko) ====

@@ -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_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_PCBHASH(faddr, lport, fport, mask) \
 	(((faddr) ^ ((faddr) >> 16) ^ ntohs((lport) ^ (fport))) & (mask))



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200311050147.hA51lKHH098295>