Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 16 Dec 2003 12:11:58 -0800 (PST)
From:      Sam Leffler <sam@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 43982 for review
Message-ID:  <200312162011.hBGKBwL7029283@repoman.freebsd.org>

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

Change 43982 by sam@sam_ebb on 2003/12/16 12:11:40

	eliminate LOR between so_rcv and radix head by changing
	tcp_twrespond to not require a socket--it had been doing
	this to be able to create a MAC label from the socket but
	instead it can create it from the inpcb that is always
	available

Affected files ...

.. //depot/projects/netperf+sockets/sys/netinet/tcp_input.c#4 edit
.. //depot/projects/netperf+sockets/sys/netinet/tcp_subr.c#4 edit
.. //depot/projects/netperf+sockets/sys/netinet/tcp_var.h#3 edit

Differences ...

==== //depot/projects/netperf+sockets/sys/netinet/tcp_input.c#4 (text+ko) ====

@@ -3044,7 +3044,7 @@
 	 */
 	if (thflags != TH_ACK || tlen != 0 || 
 	    th->th_seq != tw->rcv_nxt || th->th_ack != tw->snd_nxt)
-		tcp_twrespond(tw, NULL, m, TH_ACK);
+		tcp_twrespond(tw, TH_ACK);
 	goto drop;
 
 reset:

==== //depot/projects/netperf+sockets/sys/netinet/tcp_subr.c#4 (text+ko) ====

@@ -1573,14 +1573,14 @@
 	}
 	tcp_discardcb(tp);
 	so = inp->inp_socket;
-	SOCK_LOCK(so);			/* XXX LOR */
+	SOCK_LOCK(so);
 	so->so_pcb = NULL;
 	tw->tw_cred = crhold(so->so_cred);
 	tw->tw_so_options = so->so_options;
+	sotryfree(so);			/* NB: drops lock */
+	inp->inp_socket = NULL;
 	if (acknow)
-		tcp_twrespond(tw, so, NULL, TH_ACK);
-	sotryfree(so);
-	inp->inp_socket = NULL;
+		tcp_twrespond(tw, TH_ACK);
 	inp->inp_ppcb = (caddr_t)tw;
 	inp->inp_vflag |= INP_TIMEWAIT;
 	tcp_timer_2msl_reset(tw, tw_time);
@@ -1644,8 +1644,7 @@
  * construct a label for ay resulting packet.
  */
 int
-tcp_twrespond(struct tcptw *tw, struct socket *so, struct mbuf *msrc,
-    int flags)
+tcp_twrespond(struct tcptw *tw, int flags)
 {
 	struct inpcb *inp = tw->tw_inpcb;
 	struct tcphdr *th;
@@ -1659,8 +1658,7 @@
 	int isipv6 = inp->inp_inc.inc_isipv6;
 #endif
 
-	KASSERT(so != NULL || msrc != NULL,
-	    ("tcp_twrespond: so and msrc NULL"));
+	INP_LOCK_ASSERT(inp);
 
 	m = m_gethdr(M_DONTWAIT, MT_HEADER);
 	if (m == NULL)
@@ -1668,10 +1666,7 @@
 	m->m_data += max_linkhdr;
 
 #ifdef MAC
-	if (so != NULL)
-		mac_create_mbuf_from_socket(so, m);
-	else
-		mac_create_mbuf_netlayer(msrc, m);
+	mac_create_mbuf_from_inpcb(so, inp);
 #endif
 
 #ifdef INET6

==== //depot/projects/netperf+sockets/sys/netinet/tcp_var.h#3 (text+ko) ====

@@ -509,7 +509,7 @@
 	 tcp_quench(struct inpcb *, int);
 void	 tcp_respond(struct tcpcb *, void *,
 	    struct tcphdr *, struct mbuf *, tcp_seq, tcp_seq, int);
-int	 tcp_twrespond(struct tcptw *, struct socket *, struct mbuf *, int);
+int	 tcp_twrespond(struct tcptw *, int);
 void	 tcp_setpersist(struct tcpcb *);
 void	 tcp_slowtimo(void);
 struct tcptemp *



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