svn commit: r262747 - head/sys/netinet

Gleb Smirnoff glebius at FreeBSD.org
Tue Mar 4 19:49:42 UTC 2014


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);


More information about the svn-src-all mailing list