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));
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to