Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 14 Nov 2012 17:36:06 +0000 (UTC)
From:      "Andrey V. Elsukov" <ae@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r243031 - head/sys/netinet6
Message-ID:  <201211141736.qAEHa7FG018138@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ae
Date: Wed Nov 14 17:36:06 2012
New Revision: 243031
URL: http://svnweb.freebsd.org/changeset/base/243031

Log:
  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.
  
  Sponsored by:	Yandex LLC
  MFC after:	1 week

Modified:
  head/sys/netinet6/scope6.c

Modified: head/sys/netinet6/scope6.c
==============================================================================
--- head/sys/netinet6/scope6.c	Wed Nov 14 17:33:00 2012	(r243030)
+++ head/sys/netinet6/scope6.c	Wed Nov 14 17:36:06 2012	(r243031)
@@ -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);
 	}
 
@@ -148,7 +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);
+				IF_AFDATA_WUNLOCK(ifp);
 				return (EINVAL);
 			}
 
@@ -160,7 +160,7 @@ scope6_set(struct ifnet *ifp, struct sco
 				 * IDs, but we check the consistency for
 				 * safety in later use.
 				 */
-				IF_AFDATA_UNLOCK(ifp);
+				IF_AFDATA_WUNLOCK(ifp);
 				return (EINVAL);
 			}
 
@@ -172,7 +172,7 @@ scope6_set(struct ifnet *ifp, struct sco
 			sid->s6id_list[i] = idlist->s6id_list[i];
 		}
 	}
-	IF_AFDATA_UNLOCK(ifp);
+	IF_AFDATA_WUNLOCK(ifp);
 
 	return (error);
 }
@@ -180,18 +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);
 	}
 
 	*idlist = *sid;
 
-	IF_AFDATA_UNLOCK(ifp);
+	IF_AFDATA_RUNLOCK(ifp);
 	return (0);
 }
 
@@ -408,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);
 
@@ -425,12 +426,12 @@ 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);
 		}
 	}
@@ -457,7 +458,7 @@ in6_setscope(struct in6_addr *in6, struc
 		zoneid = 0;	/* XXX: treat as global. */
 		break;
 	}
-	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?201211141736.qAEHa7FG018138>