Author: glebius
Date: Tue Mar  4 19:49:41 2014
New Revision: 262747
URL: http://svnweb.freebsd.org/changeset/base/262747

Log:
  Remove ifa_ref()/ifa_free(), which are atomic(9), from ip_output().
  
  The ifaddr is already referenced by the rtentry, and we are holding
  reference on the rtentry throughout the function execution.
  
  Sponsored by: Netflix
  Sponsored by: Nginx, Inc.

Modified:
  head/sys/netinet/ip_output.c

Modified: head/sys/netinet/ip_output.c
==============================================================================
--- head/sys/netinet/ip_output.c        Tue Mar  4 19:41:16 2014        
(r262746)
+++ head/sys/netinet/ip_output.c        Tue Mar  4 19:49:41 2014        
(r262747)
@@ -293,7 +293,6 @@ again:
                        goto bad;
                }
                ia = ifatoia(rte->rt_ifa);
-               ifa_ref(&ia->ia_ifa);
                ifp = rte->rt_ifp;
                rte->rt_rmx.rmx_pksent++;
                if (rte->rt_flags & RTF_GATEWAY)
@@ -550,11 +549,8 @@ sendit:
 #endif
                        error = netisr_queue(NETISR_IP, m);
                        goto done;
-               } else {
-                       if (ia != NULL)
-                               ifa_free(&ia->ia_ifa);
+               } else
                        goto again;     /* Redo the routing table lookup. */
-               }
        }
 
        /* See if local, if yes, send it to netisr with IP_FASTFWD_OURS. */
@@ -583,8 +579,6 @@ sendit:
                m->m_flags |= M_SKIP_FIREWALL;
                m->m_flags &= ~M_IP_NEXTHOP;
                m_tag_delete(m, fwd_tag);
-               if (ia != NULL)
-                       ifa_free(&ia->ia_ifa);
                goto again;
        }
 
@@ -697,8 +691,6 @@ passout:
 done:
        if (ro == &iproute)
                RO_RTFREE(ro);
-       if (ia != NULL)
-               ifa_free(&ia->ia_ifa);
        return (error);
 bad:
        m_freem(m);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to