Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 1 Jan 2014 00:56:27 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r260151 - head/sys/netinet6
Message-ID:  <201401010056.s010uR70070405@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Wed Jan  1 00:56:26 2014
New Revision: 260151
URL: http://svnweb.freebsd.org/changeset/base/260151

Log:
  Use an RLOCK here instead of an RWLOCK - matching all the other calls
  to lla_lookup().
  
  This drastically reduces the very high lock contention when doing parallel
  TCP throughput tests (> 1024 sockets) with IPv6.
  
  Tested:
  
  * parallel IPv6 TCP bulk data exchange, 8192 sockets
  
  MFC after:	1 week
  Sponsored by:	Netflix, Inc.

Modified:
  head/sys/netinet6/nd6.c

Modified: head/sys/netinet6/nd6.c
==============================================================================
--- head/sys/netinet6/nd6.c	Wed Jan  1 00:45:28 2014	(r260150)
+++ head/sys/netinet6/nd6.c	Wed Jan  1 00:56:26 2014	(r260151)
@@ -1891,9 +1891,9 @@ nd6_output_lle(struct ifnet *ifp, struct
 	flags = ((m != NULL) || (lle != NULL)) ? LLE_EXCLUSIVE : 0;
 	if (ln == NULL) {
 	retry:
-		IF_AFDATA_LOCK(ifp);
+		IF_AFDATA_RLOCK(ifp);
 		ln = lla_lookup(LLTABLE6(ifp), flags, (struct sockaddr *)dst);
-		IF_AFDATA_UNLOCK(ifp);
+		IF_AFDATA_RUNLOCK(ifp);
 		if ((ln == NULL) && nd6_is_addr_neighbor(dst, ifp))  {
 			/*
 			 * Since nd6_is_addr_neighbor() internally calls nd6_lookup(),



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