Date: Tue, 24 Apr 2012 12:43:30 +0000 (UTC) From: Andre Oppermann <andre@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r234649 - in user/andre/routelocking: contrib/ipfilter/netinet contrib/pf/net kern net netinet netinet6 Message-ID: <201204241243.q3OChUqE048963@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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>
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201204241243.q3OChUqE048963>