svn commit: r234649 - in user/andre/routelocking: contrib/ipfilter/netinet contrib/pf/net kern net netinet netinet6

Andre Oppermann andre at FreeBSD.org
Tue Apr 24 12:43:30 UTC 2012


Author: andre
Date: Tue Apr 24 12:43:29 2012
New Revision: 234649
URL: http://svn.freebsd.org/changeset/base/234649

Log:
  hange the radix head lock to an rmlock (read mostly lock).
  
  There is some header pollution going on because rmlock's are
  not entirely abstracted and need per-CPU structures.
  
  A comment in _rmlock.h says this can be hidden if there were
  per-cpu linker magic/support.  I don't know if we have that
  already.

Modified:
  user/andre/routelocking/contrib/ipfilter/netinet/ip_pool.c
  user/andre/routelocking/contrib/pf/net/pf_table.c
  user/andre/routelocking/kern/subr_witness.c
  user/andre/routelocking/kern/vfs_export.c
  user/andre/routelocking/net/if.c
  user/andre/routelocking/net/radix.c
  user/andre/routelocking/net/radix.h
  user/andre/routelocking/net/radix_mpath.c
  user/andre/routelocking/net/route.c
  user/andre/routelocking/net/rtsock.c
  user/andre/routelocking/netinet/in_rmx.c
  user/andre/routelocking/netinet6/in6_ifattach.c
  user/andre/routelocking/netinet6/in6_rmx.c
  user/andre/routelocking/netinet6/nd6_rtr.c

Modified: user/andre/routelocking/contrib/ipfilter/netinet/ip_pool.c
==============================================================================
--- user/andre/routelocking/contrib/ipfilter/netinet/ip_pool.c	Tue Apr 24 12:15:50 2012	(r234648)
+++ user/andre/routelocking/contrib/ipfilter/netinet/ip_pool.c	Tue Apr 24 12:43:29 2012	(r234649)
@@ -51,6 +51,8 @@ struct file;
 #endif
 #if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000)
 # include <sys/malloc.h>
+# include <sys/lock.h>
+# include <sys/rmlock.h>
 #endif
 
 #if defined(SOLARIS2) && !defined(_KERNEL)

Modified: user/andre/routelocking/contrib/pf/net/pf_table.c
==============================================================================
--- user/andre/routelocking/contrib/pf/net/pf_table.c	Tue Apr 24 12:15:50 2012	(r234648)
+++ user/andre/routelocking/contrib/pf/net/pf_table.c	Tue Apr 24 12:43:29 2012	(r234649)
@@ -45,6 +45,8 @@ __FBSDID("$FreeBSD$");
 #include <sys/kernel.h>
 #ifdef __FreeBSD__
 #include <sys/malloc.h>
+#include <sys/lock.h>
+#include <sys/rmlock.h>
 #else
 #include <sys/pool.h>
 #endif

Modified: user/andre/routelocking/kern/subr_witness.c
==============================================================================
--- user/andre/routelocking/kern/subr_witness.c	Tue Apr 24 12:15:50 2012	(r234648)
+++ user/andre/routelocking/kern/subr_witness.c	Tue Apr 24 12:43:29 2012	(r234649)
@@ -509,7 +509,7 @@ static struct witness_order_list_entry o
 	 * Routing
 	 */
 	{ "so_rcv", &lock_class_mtx_sleep },
-	{ "radix node head", &lock_class_rw },
+	{ "radix node head", &lock_class_rm },
 	{ "rtentry", &lock_class_mtx_sleep },
 	{ "ifaddr", &lock_class_mtx_sleep },
 	{ NULL, NULL },

Modified: user/andre/routelocking/kern/vfs_export.c
==============================================================================
--- user/andre/routelocking/kern/vfs_export.c	Tue Apr 24 12:15:50 2012	(r234648)
+++ user/andre/routelocking/kern/vfs_export.c	Tue Apr 24 12:43:29 2012	(r234649)
@@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/jail.h>
 #include <sys/kernel.h>
 #include <sys/lock.h>
+#include <sys/rmlock.h> 
 #include <sys/malloc.h>
 #include <sys/mbuf.h>
 #include <sys/mount.h>
@@ -427,6 +428,7 @@ vfs_export_lookup(struct mount *mp, stru
 	register struct netcred *np;
 	register struct radix_node_head *rnh;
 	struct sockaddr *saddr;
+	struct rm_priotracker tracker;
 
 	nep = mp->mnt_export;
 	if (nep == NULL)
@@ -440,10 +442,10 @@ vfs_export_lookup(struct mount *mp, stru
 			saddr = nam;
 			rnh = nep->ne_rtable[saddr->sa_family];
 			if (rnh != NULL) {
-				RADIX_NODE_HEAD_RLOCK(rnh);
+				RADIX_NODE_HEAD_RLOCK(rnh, &tracker);
 				np = (struct netcred *)
 				    (*rnh->rnh_matchaddr)(saddr, rnh);
-				RADIX_NODE_HEAD_RUNLOCK(rnh);
+				RADIX_NODE_HEAD_RUNLOCK(rnh, &tracker);
 				if (np && np->netc_rnodes->rn_flags & RNF_ROOT)
 					np = NULL;
 			}

Modified: user/andre/routelocking/net/if.c
==============================================================================
--- user/andre/routelocking/net/if.c	Tue Apr 24 12:15:50 2012	(r234648)
+++ user/andre/routelocking/net/if.c	Tue Apr 24 12:43:29 2012	(r234649)
@@ -49,6 +49,7 @@
 #include <sys/protosw.h>
 #include <sys/kernel.h>
 #include <sys/lock.h>
+#include <sys/rmlock.h>
 #include <sys/refcount.h>
 #include <sys/module.h>
 #include <sys/rwlock.h>

Modified: user/andre/routelocking/net/radix.c
==============================================================================
--- user/andre/routelocking/net/radix.c	Tue Apr 24 12:15:50 2012	(r234648)
+++ user/andre/routelocking/net/radix.c	Tue Apr 24 12:43:29 2012	(r234649)
@@ -37,7 +37,7 @@
 #ifdef	_KERNEL
 #include <sys/lock.h>
 #include <sys/mutex.h>
-#include <sys/rwlock.h>
+#include <sys/rmlock.h>
 #include <sys/systm.h>
 #include <sys/malloc.h>
 #include <sys/syslog.h>

Modified: user/andre/routelocking/net/radix.h
==============================================================================
--- user/andre/routelocking/net/radix.h	Tue Apr 24 12:15:50 2012	(r234648)
+++ user/andre/routelocking/net/radix.h	Tue Apr 24 12:43:29 2012	(r234649)
@@ -36,7 +36,7 @@
 #ifdef _KERNEL
 #include <sys/_lock.h>
 #include <sys/_mutex.h>
-#include <sys/_rwlock.h>
+#include <sys/_rmlock.h>
 #endif
 
 #ifdef MALLOC_DECLARE
@@ -134,7 +134,7 @@ struct radix_node_head {
 		(struct radix_node *rn, struct radix_node_head *head);
 	struct	radix_node rnh_nodes[3];	/* empty tree for common case */
 #ifdef _KERNEL
-	struct	rwlock rnh_lock;		/* locks entire radix tree */
+	struct	rmlock rnh_lock;		/* locks entire radix tree */
 #endif
 };
 
@@ -148,17 +148,16 @@ struct radix_node_head {
 #define Free(p) free((caddr_t)p, M_RTABLE);
 
 #define	RADIX_NODE_HEAD_LOCK_INIT(rnh)	\
-    rw_init_flags(&(rnh)->rnh_lock, "radix node head", 0)
-#define	RADIX_NODE_HEAD_LOCK(rnh)	rw_wlock(&(rnh)->rnh_lock)
-#define	RADIX_NODE_HEAD_UNLOCK(rnh)	rw_wunlock(&(rnh)->rnh_lock)
-#define	RADIX_NODE_HEAD_RLOCK(rnh)	rw_rlock(&(rnh)->rnh_lock)
-#define	RADIX_NODE_HEAD_RUNLOCK(rnh)	rw_runlock(&(rnh)->rnh_lock)
-#define	RADIX_NODE_HEAD_LOCK_TRY_UPGRADE(rnh)	rw_try_upgrade(&(rnh)->rnh_lock)
+    rm_init_flags(&(rnh)->rnh_lock, "radix node head", 0)
+#define	RADIX_NODE_HEAD_DESTROY(rnh)	rm_destroy(&(rnh)->rnh_lock)
 
+#define	RADIX_NODE_HEAD_LOCK(rnh)	rm_wlock(&(rnh)->rnh_lock)
+#define	RADIX_NODE_HEAD_UNLOCK(rnh)	rm_wunlock(&(rnh)->rnh_lock)
+#define	RADIX_NODE_HEAD_RLOCK(rnh, tracker)	rm_rlock(&(rnh)->rnh_lock, (tracker))
+#define	RADIX_NODE_HEAD_RUNLOCK(rnh, tracker)	rm_runlock(&(rnh)->rnh_lock, (tracker))
 
-#define	RADIX_NODE_HEAD_DESTROY(rnh)	rw_destroy(&(rnh)->rnh_lock)
-#define	RADIX_NODE_HEAD_LOCK_ASSERT(rnh) rw_assert(&(rnh)->rnh_lock, RA_LOCKED)
-#define	RADIX_NODE_HEAD_WLOCK_ASSERT(rnh) rw_assert(&(rnh)->rnh_lock, RA_WLOCKED)
+#define	RADIX_NODE_HEAD_LOCK_ASSERT(rnh)	rm_assert(&(rnh)->rnh_lock, RM_WLOCKED)
+#define	RADIX_NODE_HEAD_RLOCK_ASSERT(rnh)	rm_assert(&(rnh)->rnh_lock, RM_RLOCKED)
 #endif /* _KERNEL */
 
 void	 rn_init(int);

Modified: user/andre/routelocking/net/radix_mpath.c
==============================================================================
--- user/andre/routelocking/net/radix_mpath.c	Tue Apr 24 12:15:50 2012	(r234648)
+++ user/andre/routelocking/net/radix_mpath.c	Tue Apr 24 12:43:29 2012	(r234649)
@@ -45,6 +45,8 @@ __FBSDID("$FreeBSD$");
 #include <sys/socket.h>
 #include <sys/domain.h>
 #include <sys/syslog.h>
+#include <sys/lock.h>
+#include <sys/rmlock.h>
 #include <net/radix.h>
 #include <net/radix_mpath.h>
 #include <net/route.h>

Modified: user/andre/routelocking/net/route.c
==============================================================================
--- user/andre/routelocking/net/route.c	Tue Apr 24 12:15:50 2012	(r234648)
+++ user/andre/routelocking/net/route.c	Tue Apr 24 12:43:29 2012	(r234649)
@@ -52,6 +52,8 @@
 #include <sys/proc.h>
 #include <sys/domain.h>
 #include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/rmlock.h>
 
 #include <net/if.h>
 #include <net/if_dl.h>
@@ -339,7 +341,7 @@ rtalloc_ign_fib(struct route *ro, u_long
 
 /*
  * Look up the route that matches the address given
- * Or, at least try.. Create a cloned route if needed.
+ * Or, at least try.
  *
  * The returned route, if any, is locked.
  */
@@ -351,13 +353,13 @@ rtalloc1(struct sockaddr *dst, int repor
 }
 
 struct rtentry *
-rtalloc1_fib(struct sockaddr *dst, int report, u_long ignflags,
-		    u_int fibnum)
+rtalloc1_fib(struct sockaddr *dst, int report, u_long ignflags, u_int fibnum)
 {
 	struct radix_node_head *rnh;
 	struct radix_node *rn;
 	struct rtentry *newrt;
 	struct rt_addrinfo info;
+	struct rm_priotracker tracker;
 	int err = 0, msgtype = RTM_MISS;
 	int needlock;
 
@@ -381,22 +383,23 @@ rtalloc1_fib(struct sockaddr *dst, int r
 	 */
 	needlock = !(ignflags & RTF_RNH_LOCKED);
 	if (needlock)
-		RADIX_NODE_HEAD_RLOCK(rnh);
-#ifdef INVARIANTS	
+		RADIX_NODE_HEAD_RLOCK(rnh, &tracker);
+#ifdef INVARIANTS
 	else
-		RADIX_NODE_HEAD_LOCK_ASSERT(rnh);
+		RADIX_NODE_HEAD_RLOCK_ASSERT(rnh);
 #endif
+
 	rn = rnh->rnh_matchaddr(dst, rnh);
 	if (rn && ((rn->rn_flags & RNF_ROOT) == 0)) {
 		newrt = RNTORT(rn);
 		RT_LOCK(newrt);
 		RT_ADDREF(newrt);
 		if (needlock)
-			RADIX_NODE_HEAD_RUNLOCK(rnh);
+			RADIX_NODE_HEAD_RUNLOCK(rnh, &tracker);
 		goto done;
 
 	} else if (needlock)
-		RADIX_NODE_HEAD_RUNLOCK(rnh);
+		RADIX_NODE_HEAD_RUNLOCK(rnh, &tracker);
 	
 	/*
 	 * Either we hit the root or couldn't find any match,
@@ -1085,8 +1088,11 @@ rtrequest1_fib(int req, struct rt_addrin
 	flags &= ~RTF_RNH_LOCKED;
 	if (needlock)
 		RADIX_NODE_HEAD_LOCK(rnh);
+#ifdef INVARIANTS
 	else
 		RADIX_NODE_HEAD_LOCK_ASSERT(rnh);
+#endif
+
 	/*
 	 * If we are adding a host route then we don't want to put
 	 * a netmask in the tree, nor do we want to clone it.

Modified: user/andre/routelocking/net/rtsock.c
==============================================================================
--- user/andre/routelocking/net/rtsock.c	Tue Apr 24 12:15:50 2012	(r234648)
+++ user/andre/routelocking/net/rtsock.c	Tue Apr 24 12:43:29 2012	(r234649)
@@ -51,6 +51,7 @@
 #include <sys/socketvar.h>
 #include <sys/sysctl.h>
 #include <sys/systm.h>
+#include <sys/rmlock.h>
 
 #include <net/if.h>
 #include <net/if_dl.h>
@@ -576,6 +577,7 @@ route_output(struct mbuf *m, struct sock
 	int len, error = 0;
 	struct ifnet *ifp = NULL;
 	union sockaddr_union saun;
+	struct rm_priotracker tracker;
 	sa_family_t saf = AF_UNSPEC;
 
 #define senderr(e) { error = e; goto flush;}
@@ -708,11 +710,11 @@ route_output(struct mbuf *m, struct sock
 		    info.rti_info[RTAX_DST]->sa_family);
 		if (rnh == NULL)
 			senderr(EAFNOSUPPORT);
-		RADIX_NODE_HEAD_RLOCK(rnh);
+		RADIX_NODE_HEAD_RLOCK(rnh, &tracker);
 		rt = (struct rtentry *) rnh->rnh_lookup(info.rti_info[RTAX_DST],
 			info.rti_info[RTAX_NETMASK], rnh);
 		if (rt == NULL) {	/* XXX looks bogus */
-			RADIX_NODE_HEAD_RUNLOCK(rnh);
+			RADIX_NODE_HEAD_RUNLOCK(rnh, &tracker);
 			senderr(ESRCH);
 		}
 #ifdef RADIX_MPATH
@@ -728,7 +730,7 @@ route_output(struct mbuf *m, struct sock
 		    (rtm->rtm_type != RTM_GET || info.rti_info[RTAX_GATEWAY])) {
 			rt = rt_mpath_matchgate(rt, info.rti_info[RTAX_GATEWAY]);
 			if (!rt) {
-				RADIX_NODE_HEAD_RUNLOCK(rnh);
+				RADIX_NODE_HEAD_RUNLOCK(rnh, &tracker);
 				senderr(ESRCH);
 			}
 		}
@@ -760,13 +762,13 @@ route_output(struct mbuf *m, struct sock
 			 */
 			rt = (struct rtentry *)rnh->rnh_matchaddr(&laddr, rnh);
 			if (rt == NULL) {
-				RADIX_NODE_HEAD_RUNLOCK(rnh);
+				RADIX_NODE_HEAD_RUNLOCK(rnh, &tracker);
 				senderr(ESRCH);
 			}
 		} 
 		RT_LOCK(rt);
 		RT_ADDREF(rt);
-		RADIX_NODE_HEAD_RUNLOCK(rnh);
+		RADIX_NODE_HEAD_RUNLOCK(rnh, &tracker);
 
 		/* 
 		 * Fix for PR: 82974
@@ -1838,6 +1840,7 @@ sysctl_rtsock(SYSCTL_HANDLER_ARGS)
 	int	i, lim, error = EINVAL;
 	u_char	af;
 	struct	walkarg w;
+	struct rm_priotracker tracker;
 
 	name ++;
 	namelen--;
@@ -1884,10 +1887,10 @@ sysctl_rtsock(SYSCTL_HANDLER_ARGS)
 		for (error = 0; error == 0 && i <= lim; i++) {
 			rnh = rt_tables_get_rnh(req->td->td_proc->p_fibnum, i);
 			if (rnh != NULL) {
-				RADIX_NODE_HEAD_RLOCK(rnh); 
+				RADIX_NODE_HEAD_RLOCK(rnh, &tracker);
 			    	error = rnh->rnh_walktree(rnh,
 				    sysctl_dumpentry, &w);
-				RADIX_NODE_HEAD_RUNLOCK(rnh);
+				RADIX_NODE_HEAD_RUNLOCK(rnh, &tracker);
 			} else if (af != 0)
 				error = EAFNOSUPPORT;
 		}

Modified: user/andre/routelocking/netinet/in_rmx.c
==============================================================================
--- user/andre/routelocking/netinet/in_rmx.c	Tue Apr 24 12:15:50 2012	(r234648)
+++ user/andre/routelocking/netinet/in_rmx.c	Tue Apr 24 12:43:29 2012	(r234649)
@@ -51,6 +51,8 @@ __FBSDID("$FreeBSD$");
 #include <sys/mbuf.h>
 #include <sys/syslog.h>
 #include <sys/callout.h>
+#include <sys/lock.h>
+#include <sys/rmlock.h>
 
 #include <net/if.h>
 #include <net/route.h>
@@ -77,7 +79,7 @@ in_addroute(void *v_arg, void *n_arg, st
 	struct rtentry *rt = (struct rtentry *)treenodes;
 	struct sockaddr_in *sin = (struct sockaddr_in *)rt_key(rt);
 
-	RADIX_NODE_HEAD_WLOCK_ASSERT(head);
+	RADIX_NODE_HEAD_LOCK_ASSERT(head);
 	/*
 	 * A little bit of help for both IP output and input:
 	 *   For host routes, we make sure that RTF_BROADCAST
@@ -205,7 +207,7 @@ in_rtqkill(struct radix_node *rn, void *
 	struct rtentry *rt = (struct rtentry *)rn;
 	int err;
 
-	RADIX_NODE_HEAD_WLOCK_ASSERT(ap->rnh);
+	RADIX_NODE_HEAD_LOCK_ASSERT(ap->rnh);
 
 	if (rt->rt_flags & RTPRF_OURS) {
 		ap->found++;

Modified: user/andre/routelocking/netinet6/in6_ifattach.c
==============================================================================
--- user/andre/routelocking/netinet6/in6_ifattach.c	Tue Apr 24 12:15:50 2012	(r234648)
+++ user/andre/routelocking/netinet6/in6_ifattach.c	Tue Apr 24 12:43:29 2012	(r234649)
@@ -42,6 +42,8 @@ __FBSDID("$FreeBSD$");
 #include <sys/proc.h>
 #include <sys/syslog.h>
 #include <sys/md5.h>
+#include <sys/lock.h>
+#include <sys/rmlock.h>
 
 #include <net/if.h>
 #include <net/if_dl.h>

Modified: user/andre/routelocking/netinet6/in6_rmx.c
==============================================================================
--- user/andre/routelocking/netinet6/in6_rmx.c	Tue Apr 24 12:15:50 2012	(r234648)
+++ user/andre/routelocking/netinet6/in6_rmx.c	Tue Apr 24 12:43:29 2012	(r234649)
@@ -87,6 +87,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/rwlock.h>
 #include <sys/syslog.h>
 #include <sys/callout.h>
+#include <sys/rmlock.h>
 
 #include <net/if.h>
 #include <net/route.h>
@@ -124,7 +125,7 @@ in6_addroute(void *v_arg, void *n_arg, s
 	struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)rt_key(rt);
 	struct radix_node *ret;
 
-	RADIX_NODE_HEAD_WLOCK_ASSERT(head);
+	RADIX_NODE_HEAD_LOCK_ASSERT(head);
 	if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr))
 		rt->rt_flags |= RTF_MULTICAST;
 
@@ -247,7 +248,7 @@ in6_rtqkill(struct radix_node *rn, void 
 	struct rtentry *rt = (struct rtentry *)rn;
 	int err;
 
-	RADIX_NODE_HEAD_WLOCK_ASSERT(ap->rnh);
+	RADIX_NODE_HEAD_LOCK_ASSERT(ap->rnh);
 
 	if (rt->rt_flags & RTPRF_OURS) {
 		ap->found++;

Modified: user/andre/routelocking/netinet6/nd6_rtr.c
==============================================================================
--- user/andre/routelocking/netinet6/nd6_rtr.c	Tue Apr 24 12:15:50 2012	(r234648)
+++ user/andre/routelocking/netinet6/nd6_rtr.c	Tue Apr 24 12:43:29 2012	(r234649)
@@ -48,6 +48,8 @@ __FBSDID("$FreeBSD$");
 #include <sys/rwlock.h>
 #include <sys/syslog.h>
 #include <sys/queue.h>
+#include <sys/lock.h>
+#include <sys/rmlock.h>
 
 #include <net/if.h>
 #include <net/if_types.h>


More information about the svn-src-user mailing list