svn commit: r186199 - in head: . sys/net

Kip Macy kmacy at FreeBSD.org
Wed Dec 17 00:11:57 UTC 2008


Author: kmacy
Date: Wed Dec 17 00:11:56 2008
New Revision: 186199
URL: http://svn.freebsd.org/changeset/base/186199

Log:
  convert ifnet and afdata locks from mutexes to rwlocks

Modified:
  head/UPDATING
  head/sys/net/if.c
  head/sys/net/if_var.h

Modified: head/UPDATING
==============================================================================
--- head/UPDATING	Tue Dec 16 23:56:24 2008	(r186198)
+++ head/UPDATING	Wed Dec 17 00:11:56 2008	(r186199)
@@ -21,6 +21,9 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 8.
 	developers choose to disable these features on build machines
 	to maximize performance.  (To disable malloc debugging, run
 	ln -s aj /etc/malloc.conf.)
+20081216:
+	The afdata and ifnet locks have been changed from mutexes to 
+	rwlocks, network modules will need to be re-compiled.
 
 20081214:
 	__FreeBSD_version 800059 incorporates the new arp-v2 rewrite.

Modified: head/sys/net/if.c
==============================================================================
--- head/sys/net/if.c	Tue Dec 16 23:56:24 2008	(r186198)
+++ head/sys/net/if.c	Wed Dec 17 00:11:56 2008	(r186199)
@@ -158,7 +158,7 @@ static struct	knlist ifklist;
 #endif
 
 int	ifqmaxlen = IFQ_MAXLEN;
-struct	mtx ifnet_lock;
+struct rwlock ifnet_lock;
 static	if_com_alloc_t *if_com_alloc[256];
 static	if_com_free_t *if_com_free[256];
 

Modified: head/sys/net/if_var.h
==============================================================================
--- head/sys/net/if_var.h	Tue Dec 16 23:56:24 2008	(r186198)
+++ head/sys/net/if_var.h	Wed Dec 17 00:11:56 2008	(r186199)
@@ -80,6 +80,7 @@ struct  ifvlantrunk;
 #endif /* _KERNEL */
 #include <sys/lock.h>		/* XXX */
 #include <sys/mutex.h>		/* XXX */
+#include <sys/rwlock.h>		/* XXX */
 #include <sys/event.h>		/* XXX */
 #include <sys/_task.h>
 
@@ -175,7 +176,7 @@ struct ifnet {
 	struct	ifprefixhead if_prefixhead; /* list of prefixes per if */
 	void	*if_afdata[AF_MAX];
 	int	if_afdata_initialized;
-	struct	mtx if_afdata_mtx;
+	struct	rwlock if_afdata_lock;
 	struct	task if_starttask;	/* task for IFF_NEEDSGIANT */
 	struct	task if_linktask;	/* task for link change events */
 	struct	mtx if_addr_mtx;	/* mutex to protect address lists */
@@ -185,8 +186,8 @@ struct ifnet {
 					/* protected by if_addr_mtx */
 	void	*if_pf_kif;
 	void	*if_lagg;		/* lagg glue */
-	void	*if_pspare[8];		/* multiq/TOE 3; vimage 3; general use 4 */
-	void	(*if_qflush)	/* flush any queues */
+	void	*if_pspare[8];		/* TOE 3; vimage 3; general use 4 */
+	void	(*if_qflush)		/* flush any queues */
 		(struct ifnet *);
 	int	(*if_transmit)	/* initiate output routine */
 		(struct ifnet *, struct mbuf *);
@@ -358,14 +359,19 @@ typedef void (*group_change_event_handle
 EVENTHANDLER_DECLARE(group_change_event, group_change_event_handler_t);
 
 #define	IF_AFDATA_LOCK_INIT(ifp)	\
-    mtx_init(&(ifp)->if_afdata_mtx, "if_afdata", NULL, MTX_DEF)
-#define	IF_AFDATA_LOCK(ifp)	mtx_lock(&(ifp)->if_afdata_mtx)
-#define	IF_AFDATA_TRYLOCK(ifp)	mtx_trylock(&(ifp)->if_afdata_mtx)
-#define	IF_AFDATA_UNLOCK(ifp)	mtx_unlock(&(ifp)->if_afdata_mtx)
-#define	IF_AFDATA_DESTROY(ifp)	mtx_destroy(&(ifp)->if_afdata_mtx)
+	rw_init(&(ifp)->if_afdata_lock, "if_afdata")
 
-#define	IF_AFDATA_LOCK_ASSERT(ifp)	mtx_assert(&(ifp)->if_afdata_mtx, MA_OWNED)
-#define	IF_AFDATA_UNLOCK_ASSERT(ifp)	mtx_assert(&(ifp)->if_afdata_mtx, MA_NOTOWNED)
+#define	IF_AFDATA_WLOCK(ifp)	rw_wlock(&(ifp)->if_afdata_lock)
+#define	IF_AFDATA_RLOCK(ifp)	rw_rlock(&(ifp)->if_afdata_lock)
+#define	IF_AFDATA_WUNLOCK(ifp)	rw_wunlock(&(ifp)->if_afdata_lock)
+#define	IF_AFDATA_RUNLOCK(ifp)	rw_runlock(&(ifp)->if_afdata_lock)
+#define	IF_AFDATA_LOCK(ifp)	IF_AFDATA_WLOCK(ifp)
+#define	IF_AFDATA_UNLOCK(ifp)	IF_AFDATA_WUNLOCK(ifp)
+#define	IF_AFDATA_TRYLOCK(ifp)	rw_try_wlock(&(ifp)->if_afdata_lock)
+#define	IF_AFDATA_DESTROY(ifp)	rw_destroy(&(ifp)->if_afdata_lock)
+
+#define	IF_AFDATA_LOCK_ASSERT(ifp)	rw_assert(&(ifp)->if_afdata_lock, RA_LOCKED)
+#define	IF_AFDATA_UNLOCK_ASSERT(ifp)	rw_assert(&(ifp)->if_afdata_lock, RA_UNLOCKED)
 
 #define	IFF_LOCKGIANT(ifp) do {						\
 	if ((ifp)->if_flags & IFF_NEEDSGIANT)				\
@@ -637,14 +643,14 @@ struct ifmultiaddr {
 		IFA_UNLOCK(ifa);			\
 	} while (0)
 
-extern	struct mtx ifnet_lock;
+extern	struct rwlock ifnet_lock;
 #define	IFNET_LOCK_INIT() \
-    mtx_init(&ifnet_lock, "ifnet", NULL, MTX_DEF | MTX_RECURSE)
-#define	IFNET_WLOCK()		mtx_lock(&ifnet_lock)
-#define	IFNET_WUNLOCK()		mtx_unlock(&ifnet_lock)
-#define	IFNET_WLOCK_ASSERT()	mtx_assert(&ifnet_lock, MA_OWNED)
-#define	IFNET_RLOCK()		IFNET_WLOCK()
-#define	IFNET_RUNLOCK()		IFNET_WUNLOCK()
+   rw_init_flags(&ifnet_lock, "ifnet",  RW_RECURSE)
+#define	IFNET_WLOCK()		rw_wlock(&ifnet_lock)
+#define	IFNET_WUNLOCK()		rw_wunlock(&ifnet_lock)
+#define	IFNET_WLOCK_ASSERT()	rw_assert(&ifnet_lock, RA_LOCKED)
+#define	IFNET_RLOCK()		rw_rlock(&ifnet_lock)
+#define	IFNET_RUNLOCK()		rw_runlock(&ifnet_lock)	
 
 struct ifindex_entry {
 	struct	ifnet *ife_ifnet;


More information about the svn-src-all mailing list