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)) {
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to