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