summaryrefslogtreecommitdiffstats
path: root/sys/netinet/if_ether.c
diff options
context:
space:
mode:
authorkmacy <kmacy@FreeBSD.org>2008-12-17 00:14:28 +0000
committerkmacy <kmacy@FreeBSD.org>2008-12-17 00:14:28 +0000
commitea41cce94c12f9b48c1557f7378c6ee84f2a25bf (patch)
tree30a2eb0e65c56dff16392c86287d78e922b6e20e /sys/netinet/if_ether.c
parentd0147f27c78887e74c73b5157a363120412f0c73 (diff)
downloadFreeBSD-src-ea41cce94c12f9b48c1557f7378c6ee84f2a25bf.zip
FreeBSD-src-ea41cce94c12f9b48c1557f7378c6ee84f2a25bf.tar.gz
default to doing lla_lookup with shared afdata lock and returning a
shared lock on the lle - thus restoring parallel performance to pre-arpv2 level
Diffstat (limited to 'sys/netinet/if_ether.c')
-rw-r--r--sys/netinet/if_ether.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c
index b50e1d9..7bea5aa 100644
--- a/sys/netinet/if_ether.c
+++ b/sys/netinet/if_ether.c
@@ -251,7 +251,7 @@ arpresolve(struct ifnet *ifp, struct rtentry *rt0, struct mbuf *m,
{
INIT_VNET_INET(ifp->if_vnet);
struct llentry *la = 0;
- u_int flags;
+ u_int flags = 0;
int error, renew;
*lle = NULL;
@@ -268,18 +268,19 @@ arpresolve(struct ifnet *ifp, struct rtentry *rt0, struct mbuf *m,
return (0);
}
}
-
- flags = (ifp->if_flags & (IFF_NOARP | IFF_STATICARP)) ? 0 : LLE_CREATE;
-
/* XXXXX
- * Since this function returns an llentry, the
- * lock is held by the caller.
- * XXX if caller is required to hold lock, assert it
*/
retry:
- IF_AFDATA_LOCK(ifp);
+ IF_AFDATA_RLOCK(ifp);
la = lla_lookup(LLTABLE(ifp), flags, dst);
- IF_AFDATA_UNLOCK(ifp);
+ IF_AFDATA_RUNLOCK(ifp);
+ if ((la == NULL) && ((flags & LLE_EXCLUSIVE) == 0)
+ && ((ifp->if_flags & (IFF_NOARP | IFF_STATICARP)) == 0)) {
+ flags |= (LLE_CREATE | LLE_EXCLUSIVE);
+ IF_AFDATA_WLOCK(ifp);
+ la = lla_lookup(LLTABLE(ifp), flags, dst);
+ IF_AFDATA_WUNLOCK(ifp);
+ }
if (la == NULL) {
if (flags & LLE_CREATE)
log(LOG_DEBUG,
OpenPOWER on IntegriCloud