Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 3 Aug 2016 06:32:44 +0000 (UTC)
From:      Mike Karels <karels@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r303698 - in stable/11/sys: netinet netinet6
Message-ID:  <201608030632.u736Wim6032724@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: karels
Date: Wed Aug  3 06:32:44 2016
New Revision: 303698
URL: https://svnweb.freebsd.org/changeset/base/303698

Log:
  MFC r303171: 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)
  Approved by: re (kostikbel)
  Differential Revision: https://reviews.freebsd.org/D7239

Modified:
  stable/11/sys/netinet/if_ether.c
  stable/11/sys/netinet6/nd6.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/netinet/if_ether.c
==============================================================================
--- stable/11/sys/netinet/if_ether.c	Wed Aug  3 03:49:42 2016	(r303697)
+++ stable/11/sys/netinet/if_ether.c	Wed Aug  3 06:32:44 2016	(r303698)
@@ -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: stable/11/sys/netinet6/nd6.c
==============================================================================
--- stable/11/sys/netinet6/nd6.c	Wed Aug  3 03:49:42 2016	(r303697)
+++ stable/11/sys/netinet6/nd6.c	Wed Aug  3 06:32:44 2016	(r303698)
@@ -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));



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