Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 Nov 2012 00:25:58 +0000 (UTC)
From:      "Andrey V. Elsukov" <ae@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r243383 - stable/8/sys/netinet6
Message-ID:  <201211220025.qAM0PwVL060970@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ae
Date: Thu Nov 22 00:25:57 2012
New Revision: 243383
URL: http://svnweb.freebsd.org/changeset/base/243383

Log:
  MFC r243028:
    zoneid has unsigned type.
  
  MFC r243029:
    SCOPE6_LOCK protects V_sid_default, no need to acquire it without
    any access to V_sid_default.
  
  MFC r243031:
    if_afdata lock was converted from mutex to rwlock a long ago, so we can
    replace IF_AFDATA_LOCK() macro depending to the access type.
  
  MFC r243148:
    Reduce the overhead of locking, use IF_AFDATA_RLOCK() when we are doing
    simple lookups.

Modified:
  stable/8/sys/netinet6/icmp6.c
  stable/8/sys/netinet6/in6_src.c
  stable/8/sys/netinet6/ip6_input.c
  stable/8/sys/netinet6/nd6.c
  stable/8/sys/netinet6/nd6_rtr.c
  stable/8/sys/netinet6/scope6.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/netinet6/   (props changed)

Modified: stable/8/sys/netinet6/icmp6.c
==============================================================================
--- stable/8/sys/netinet6/icmp6.c	Thu Nov 22 00:22:54 2012	(r243382)
+++ stable/8/sys/netinet6/icmp6.c	Thu Nov 22 00:25:57 2012	(r243383)
@@ -2600,9 +2600,9 @@ icmp6_redirect_output(struct mbuf *m0, s
 		struct nd_opt_hdr *nd_opt;
 		char *lladdr;
 
-		IF_AFDATA_LOCK(ifp);
+		IF_AFDATA_RLOCK(ifp);
 		ln = nd6_lookup(router_ll6, 0, ifp);
-		IF_AFDATA_UNLOCK(ifp);
+		IF_AFDATA_RUNLOCK(ifp);
 		if (ln == NULL)
 			goto nolladdropt;
 

Modified: stable/8/sys/netinet6/in6_src.c
==============================================================================
--- stable/8/sys/netinet6/in6_src.c	Thu Nov 22 00:22:54 2012	(r243382)
+++ stable/8/sys/netinet6/in6_src.c	Thu Nov 22 00:25:57 2012	(r243383)
@@ -608,9 +608,9 @@ selectroute(struct sockaddr_in6 *dstsock
 
 		rt = ron->ro_rt;
 		ifp = rt->rt_ifp;
-		IF_AFDATA_LOCK(ifp);
+		IF_AFDATA_RLOCK(ifp);
 		la = lla_lookup(LLTABLE6(ifp), 0, (struct sockaddr *)&sin6_next->sin6_addr);
-		IF_AFDATA_UNLOCK(ifp);
+		IF_AFDATA_RUNLOCK(ifp);
 		if (la != NULL) 
 			LLE_RUNLOCK(la);
 		else {

Modified: stable/8/sys/netinet6/ip6_input.c
==============================================================================
--- stable/8/sys/netinet6/ip6_input.c	Thu Nov 22 00:22:54 2012	(r243382)
+++ stable/8/sys/netinet6/ip6_input.c	Thu Nov 22 00:25:57 2012	(r243383)
@@ -542,10 +542,10 @@ passin:
 	dst6.sin6_len = sizeof(struct sockaddr_in6);
 	dst6.sin6_addr = ip6->ip6_dst;
 	ifp = m->m_pkthdr.rcvif;
-	IF_AFDATA_LOCK(ifp);
+	IF_AFDATA_RLOCK(ifp);
 	lle = lla_lookup(LLTABLE6(ifp), 0,
 	     (struct sockaddr *)&dst6);
-	IF_AFDATA_UNLOCK(ifp);
+	IF_AFDATA_RUNLOCK(ifp);
 	if ((lle != NULL) && (lle->la_flags & LLE_IFADDR)) {
 		struct ifaddr *ifa;
 		struct in6_ifaddr *ia6;

Modified: stable/8/sys/netinet6/nd6.c
==============================================================================
--- stable/8/sys/netinet6/nd6.c	Thu Nov 22 00:22:54 2012	(r243382)
+++ stable/8/sys/netinet6/nd6.c	Thu Nov 22 00:25:57 2012	(r243383)
@@ -977,12 +977,12 @@ nd6_is_addr_neighbor(struct sockaddr_in6
 	 * Even if the address matches none of our addresses, it might be
 	 * in the neighbor cache.
 	 */
-	IF_AFDATA_LOCK(ifp);
+	IF_AFDATA_RLOCK(ifp);
 	if ((lle = nd6_lookup(&addr->sin6_addr, 0, ifp)) != NULL) {
 		LLE_RUNLOCK(lle);
 		rc = 1;
 	}
-	IF_AFDATA_UNLOCK(ifp);
+	IF_AFDATA_RUNLOCK(ifp);
 	return (rc);
 }
 
@@ -1402,9 +1402,9 @@ nd6_ioctl(u_long cmd, caddr_t data, stru
 		if ((error = in6_setscope(&nb_addr, ifp, NULL)) != 0)
 			return (error);
 
-		IF_AFDATA_LOCK(ifp);
+		IF_AFDATA_RLOCK(ifp);
 		ln = nd6_lookup(&nb_addr, 0, ifp);
-		IF_AFDATA_UNLOCK(ifp);
+		IF_AFDATA_RUNLOCK(ifp);
 
 		if (ln == NULL) {
 			error = EINVAL;
@@ -2096,9 +2096,9 @@ nd6_storelladdr(struct ifnet *ifp, struc
 	/*
 	 * the entry should have been created in nd6_store_lladdr
 	 */
-	IF_AFDATA_LOCK(ifp);
+	IF_AFDATA_RLOCK(ifp);
 	ln = lla_lookup(LLTABLE6(ifp), 0, dst);
-	IF_AFDATA_UNLOCK(ifp);
+	IF_AFDATA_RUNLOCK(ifp);
 	if ((ln == NULL) || !(ln->la_flags & LLE_VALID)) {
 		if (ln != NULL)
 			LLE_RUNLOCK(ln);

Modified: stable/8/sys/netinet6/nd6_rtr.c
==============================================================================
--- stable/8/sys/netinet6/nd6_rtr.c	Thu Nov 22 00:22:54 2012	(r243382)
+++ stable/8/sys/netinet6/nd6_rtr.c	Thu Nov 22 00:25:57 2012	(r243383)
@@ -647,13 +647,13 @@ defrouter_select(void)
 	 * the ordering rule of the list described in defrtrlist_update().
 	 */
 	TAILQ_FOREACH(dr, &V_nd_defrouter, dr_entry) {
-		IF_AFDATA_LOCK(dr->ifp);
+		IF_AFDATA_RLOCK(dr->ifp);
 		if (selected_dr == NULL &&
 		    (ln = nd6_lookup(&dr->rtaddr, 0, dr->ifp)) &&
 		    ND6_IS_LLINFO_PROBREACH(ln)) {
 			selected_dr = dr;
 		}
-		IF_AFDATA_UNLOCK(dr->ifp);
+		IF_AFDATA_RUNLOCK(dr->ifp);
 		if (ln != NULL) {
 			LLE_RUNLOCK(ln);
 			ln = NULL;
@@ -681,13 +681,13 @@ defrouter_select(void)
 		else
 			selected_dr = TAILQ_NEXT(installed_dr, dr_entry);
 	} else if (installed_dr) {
-		IF_AFDATA_LOCK(installed_dr->ifp);
+		IF_AFDATA_RLOCK(installed_dr->ifp);
 		if ((ln = nd6_lookup(&installed_dr->rtaddr, 0, installed_dr->ifp)) &&
 		    ND6_IS_LLINFO_PROBREACH(ln) &&
 		    rtpref(selected_dr) <= rtpref(installed_dr)) {
 			selected_dr = installed_dr;
 		}
-		IF_AFDATA_UNLOCK(installed_dr->ifp);
+		IF_AFDATA_RUNLOCK(installed_dr->ifp);
 		if (ln != NULL)
 			LLE_RUNLOCK(ln);
 	}
@@ -1330,9 +1330,9 @@ find_pfxlist_reachable_router(struct nd_
 	int canreach;
 
 	LIST_FOREACH(pfxrtr, &pr->ndpr_advrtrs, pfr_entry) {
-		IF_AFDATA_LOCK(pfxrtr->router->ifp);
+		IF_AFDATA_RLOCK(pfxrtr->router->ifp);
 		ln = nd6_lookup(&pfxrtr->router->rtaddr, 0, pfxrtr->router->ifp);
-		IF_AFDATA_UNLOCK(pfxrtr->router->ifp);
+		IF_AFDATA_RUNLOCK(pfxrtr->router->ifp);
 		if (ln == NULL)
 			continue;
 		canreach = ND6_IS_LLINFO_PROBREACH(ln);

Modified: stable/8/sys/netinet6/scope6.c
==============================================================================
--- stable/8/sys/netinet6/scope6.c	Thu Nov 22 00:22:54 2012	(r243382)
+++ stable/8/sys/netinet6/scope6.c	Thu Nov 22 00:25:57 2012	(r243383)
@@ -121,11 +121,11 @@ scope6_set(struct ifnet *ifp, struct sco
 	int error = 0;
 	struct scope6_id *sid = NULL;
 
-	IF_AFDATA_LOCK(ifp);
+	IF_AFDATA_WLOCK(ifp);
 	sid = SID(ifp);
 
 	if (!sid) {	/* paranoid? */
-		IF_AFDATA_UNLOCK(ifp);
+		IF_AFDATA_WUNLOCK(ifp);
 		return (EINVAL);
 	}
 
@@ -139,7 +139,6 @@ scope6_set(struct ifnet *ifp, struct sco
 	 * interface addresses, routing table entries, PCB entries...
 	 */
 
-	SCOPE6_LOCK();
 	for (i = 0; i < 16; i++) {
 		if (idlist->s6id_list[i] &&
 		    idlist->s6id_list[i] != sid->s6id_list[i]) {
@@ -149,8 +148,7 @@ scope6_set(struct ifnet *ifp, struct sco
 			 */
 			if (i == IPV6_ADDR_SCOPE_INTFACELOCAL &&
 			    idlist->s6id_list[i] != ifp->if_index) {
-				IF_AFDATA_UNLOCK(ifp);
-				SCOPE6_UNLOCK();
+				IF_AFDATA_WUNLOCK(ifp);
 				return (EINVAL);
 			}
 
@@ -162,8 +160,7 @@ scope6_set(struct ifnet *ifp, struct sco
 				 * IDs, but we check the consistency for
 				 * safety in later use.
 				 */
-				IF_AFDATA_UNLOCK(ifp);
-				SCOPE6_UNLOCK();
+				IF_AFDATA_WUNLOCK(ifp);
 				return (EINVAL);
 			}
 
@@ -175,8 +172,7 @@ scope6_set(struct ifnet *ifp, struct sco
 			sid->s6id_list[i] = idlist->s6id_list[i];
 		}
 	}
-	SCOPE6_UNLOCK();
-	IF_AFDATA_UNLOCK(ifp);
+	IF_AFDATA_WUNLOCK(ifp);
 
 	return (error);
 }
@@ -184,20 +180,19 @@ scope6_set(struct ifnet *ifp, struct sco
 int
 scope6_get(struct ifnet *ifp, struct scope6_id *idlist)
 {
-	/* We only need to lock the interface's afdata for SID() to work. */
-	IF_AFDATA_LOCK(ifp);
-	struct scope6_id *sid = SID(ifp);
+	struct scope6_id *sid;
 
+	/* We only need to lock the interface's afdata for SID() to work. */
+	IF_AFDATA_RLOCK(ifp);
+	sid = SID(ifp);
 	if (sid == NULL) {	/* paranoid? */
-		IF_AFDATA_UNLOCK(ifp);
+		IF_AFDATA_RUNLOCK(ifp);
 		return (EINVAL);
 	}
 
-	SCOPE6_LOCK();
 	*idlist = *sid;
-	SCOPE6_UNLOCK();
 
-	IF_AFDATA_UNLOCK(ifp);
+	IF_AFDATA_RUNLOCK(ifp);
 	return (0);
 }
 
@@ -388,7 +383,7 @@ sa6_recoverscope(struct sockaddr_in6 *si
 		zoneid = ntohs(sin6->sin6_addr.s6_addr16[1]);
 		if (zoneid) {
 			/* sanity check */
-			if (zoneid < 0 || V_if_index < zoneid)
+			if (V_if_index < zoneid)
 				return (ENXIO);
 			if (!ifnet_byindex(zoneid))
 				return (ENXIO);
@@ -414,7 +409,7 @@ in6_setscope(struct in6_addr *in6, struc
 	u_int32_t zoneid = 0;
 	struct scope6_id *sid;
 
-	IF_AFDATA_LOCK(ifp);
+	IF_AFDATA_RLOCK(ifp);
 
 	sid = SID(ifp);
 
@@ -431,19 +426,17 @@ in6_setscope(struct in6_addr *in6, struc
 	 */
 	if (IN6_IS_ADDR_LOOPBACK(in6)) {
 		if (!(ifp->if_flags & IFF_LOOPBACK)) {
-			IF_AFDATA_UNLOCK(ifp);
+			IF_AFDATA_RUNLOCK(ifp);
 			return (EINVAL);
 		} else {
 			if (ret_id != NULL)
 				*ret_id = 0; /* there's no ambiguity */
-			IF_AFDATA_UNLOCK(ifp);
+			IF_AFDATA_RUNLOCK(ifp);
 			return (0);
 		}
 	}
 
 	scope = in6_addrscope(in6);
-
-	SCOPE6_LOCK();
 	switch (scope) {
 	case IPV6_ADDR_SCOPE_INTFACELOCAL: /* should be interface index */
 		zoneid = sid->s6id_list[IPV6_ADDR_SCOPE_INTFACELOCAL];
@@ -465,8 +458,7 @@ in6_setscope(struct in6_addr *in6, struc
 		zoneid = 0;	/* XXX: treat as global. */
 		break;
 	}
-	SCOPE6_UNLOCK();
-	IF_AFDATA_UNLOCK(ifp);
+	IF_AFDATA_RUNLOCK(ifp);
 
 	if (ret_id != NULL)
 		*ret_id = zoneid;



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