svn commit: r303171 - in head/sys: netinet netinet6

Mike Karels karels at FreeBSD.org
Fri Jul 22 02:11:50 UTC 2016


Author: karels
Date: Fri Jul 22 02:11:49 2016
New Revision: 303171
URL: https://svnweb.freebsd.org/changeset/base/303171

Log:
  Fix per-connection L2 caching in fast path
  
  r301217 re-added per-connection L2 caching from a previous change,
  but it omitted caching in the fast path.  Add it.
  
  Reviewed By: gallatin
  Approved by: gnn (mentor)
  Differential Revision: https://reviews.freebsd.org/D7239

Modified:
  head/sys/netinet/if_ether.c
  head/sys/netinet6/nd6.c

Modified: head/sys/netinet/if_ether.c
==============================================================================
--- head/sys/netinet/if_ether.c	Fri Jul 22 01:16:56 2016	(r303170)
+++ head/sys/netinet/if_ether.c	Fri Jul 22 02:11:49 2016	(r303171)
@@ -607,7 +607,7 @@ arpresolve(struct ifnet *ifp, int is_gw,
 	}
 
 	IF_AFDATA_RLOCK(ifp);
-	la = lla_lookup(LLTABLE(ifp), LLE_UNLOCKED, dst);
+	la = lla_lookup(LLTABLE(ifp), plle ? LLE_EXCLUSIVE : LLE_UNLOCKED, dst);
 	if (la != NULL && (la->r_flags & RLLE_VALID) != 0) {
 		/* Entry found, let's copy lle info */
 		bcopy(la->r_linkdata, desten, la->r_hdrlen);
@@ -619,9 +619,16 @@ arpresolve(struct ifnet *ifp, int is_gw,
 			la->r_skip_req = 0; /* Notify that entry was used */
 			LLE_REQ_UNLOCK(la);
 		}
+		if (plle) {
+			LLE_ADDREF(la);
+			*plle = la;
+			LLE_WUNLOCK(la);
+		}
 		IF_AFDATA_RUNLOCK(ifp);
 		return (0);
 	}
+	if (plle && la)
+		LLE_WUNLOCK(la);
 	IF_AFDATA_RUNLOCK(ifp);
 
 	return (arpresolve_full(ifp, is_gw, la == NULL ? LLE_CREATE : 0, m, dst,

Modified: head/sys/netinet6/nd6.c
==============================================================================
--- head/sys/netinet6/nd6.c	Fri Jul 22 01:16:56 2016	(r303170)
+++ head/sys/netinet6/nd6.c	Fri Jul 22 02:11:49 2016	(r303171)
@@ -2222,7 +2222,8 @@ nd6_resolve(struct ifnet *ifp, int is_gw
 	}
 
 	IF_AFDATA_RLOCK(ifp);
-	ln = nd6_lookup(&dst6->sin6_addr, LLE_UNLOCKED, ifp);
+	ln = nd6_lookup(&dst6->sin6_addr, plle ? LLE_EXCLUSIVE : LLE_UNLOCKED,
+	    ifp);
 	if (ln != NULL && (ln->r_flags & RLLE_VALID) != 0) {
 		/* Entry found, let's copy lle info */
 		bcopy(ln->r_linkdata, desten, ln->r_hdrlen);
@@ -2235,9 +2236,15 @@ nd6_resolve(struct ifnet *ifp, int is_gw
 			ln->lle_hittime = time_uptime;
 			LLE_REQ_UNLOCK(ln);
 		}
+		if (plle) {
+			LLE_ADDREF(ln);
+			*plle = ln;
+			LLE_WUNLOCK(ln);
+		}
 		IF_AFDATA_RUNLOCK(ifp);
 		return (0);
-	}
+	} else if (plle && ln)
+		LLE_WUNLOCK(ln);
 	IF_AFDATA_RUNLOCK(ifp);
 
 	return (nd6_resolve_slow(ifp, 0, m, dst6, desten, pflags, plle));


More information about the svn-src-head mailing list