Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 28 Jul 2016 19:32:25 +0000 (UTC)
From:      Andrew Gallatin <gallatin@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r303457 - head/sys/netinet
Message-ID:  <201607281932.u6SJWPCX001609@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gallatin
Date: Thu Jul 28 19:32:25 2016
New Revision: 303457
URL: https://svnweb.freebsd.org/changeset/base/303457

Log:
  Call tcp_notify() directly to shoot down routes, rather than
  calling in_pcbnotifyall().
  
  This avoids lock contention on tcbinfo due to in_pcbnotifyall()
  holding the tcbinfo write lock while walking all connections.
  
  Reviewed by:	rrs, karels
  MFC after:	2 weeks
  Sponsored by:	Netflix, Inc.
  Differential Revision:	https://reviews.freebsd.org/D7251

Modified:
  head/sys/netinet/tcp_subr.c

Modified: head/sys/netinet/tcp_subr.c
==============================================================================
--- head/sys/netinet/tcp_subr.c	Thu Jul 28 18:40:43 2016	(r303456)
+++ head/sys/netinet/tcp_subr.c	Thu Jul 28 19:32:25 2016	(r303457)
@@ -1950,11 +1950,7 @@ tcp_ctlinput(int cmd, struct sockaddr *s
 	else if (V_icmp_may_rst && (cmd == PRC_UNREACH_ADMIN_PROHIB ||
 		cmd == PRC_UNREACH_PORT || cmd == PRC_TIMXCEED_INTRANS) && ip)
 		notify = tcp_drop_syn_sent;
-	else if (PRC_IS_REDIRECT(cmd)) {
-		/* signal EHOSTDOWN, as it flushes the cached route */
-		in_pcbnotifyall(&V_tcbinfo, faddr, EHOSTDOWN, notify);
-		return;
-	}
+
 	/*
 	 * Hostdead is ugly because it goes linearly through all PCBs.
 	 * XXX: We never get this from ICMP, otherwise it makes an
@@ -1975,7 +1971,12 @@ tcp_ctlinput(int cmd, struct sockaddr *s
 	INP_INFO_RLOCK(&V_tcbinfo);
 	inp = in_pcblookup(&V_tcbinfo, faddr, th->th_dport, ip->ip_src,
 	    th->th_sport, INPLOOKUP_WLOCKPCB, NULL);
-	if (inp != NULL)  {
+	if (inp != NULL && PRC_IS_REDIRECT(cmd)) {
+		/* signal EHOSTDOWN, as it flushes the cached route */
+		inp = (*notify)(inp, EHOSTDOWN);
+		if (inp != NULL)
+			INP_WUNLOCK(inp);
+	} else if (inp != NULL)  {
 		if (!(inp->inp_flags & INP_TIMEWAIT) &&
 		    !(inp->inp_flags & INP_DROPPED) &&
 		    !(inp->inp_socket == NULL)) {



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