commit 7f3a5c31ffcad9608c26a12ae26fcad6c3910173 Author: Andrey V. Elsukov Date: Tue Sep 5 15:10:11 2017 +0300 Migrate AFDATA lock to rmlock. diff --git a/sys/net/if_llatbl.c b/sys/net/if_llatbl.c index feffe6c9547..b1f361e37f7 100644 --- a/sys/net/if_llatbl.c +++ b/sys/net/if_llatbl.c @@ -88,6 +88,7 @@ static int htable_foreach_lle(struct lltable *llt, llt_foreach_cb_t *f, static int lltable_dump_af(struct lltable *llt, struct sysctl_req *wr) { + IF_AFDATA_RLOCK_TRACKER; int error; LLTABLE_LIST_LOCK_ASSERT(); @@ -448,6 +449,7 @@ struct llentry * llentry_alloc(struct ifnet *ifp, struct lltable *lt, struct sockaddr_storage *dst) { + IF_AFDATA_RLOCK_TRACKER; struct llentry *la, *la_tmp; IF_AFDATA_RLOCK(ifp); diff --git a/sys/net/if_var.h b/sys/net/if_var.h index d4d2ddceeff..9e62a497b25 100644 --- a/sys/net/if_var.h +++ b/sys/net/if_var.h @@ -75,9 +75,11 @@ struct netmap_adapter; #include #endif /* _KERNEL */ #include +#include #include /* XXX */ #include /* struct ifqueue */ #include /* XXX */ +#include /* XXX */ #include /* XXX */ #include /* if_link_task */ @@ -283,7 +285,7 @@ struct ifnet { struct ifaddr *if_addr; /* pointer to link-level address */ void *if_hw_addr; /* hardware link-level address */ const u_int8_t *if_broadcastaddr; /* linklevel broadcast bytestring */ - struct rwlock if_afdata_lock; + struct rmlock if_afdata_lock; void *if_afdata[AF_MAX]; int if_afdata_initialized; @@ -446,21 +448,23 @@ EVENTHANDLER_DECLARE(group_change_event, group_change_event_handler_t); #endif /* _SYS_EVENTHANDLER_H_ */ #define IF_AFDATA_LOCK_INIT(ifp) \ - rw_init(&(ifp)->if_afdata_lock, "if_afdata") - -#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) + rm_init(&(ifp)->if_afdata_lock, "if_afdata") + +#define IF_AFDATA_RLOCK_TRACKER struct rm_priotracker _afdata_tracker +#define IF_AFDATA_WLOCK(ifp) rm_wlock(&(ifp)->if_afdata_lock) +#define IF_AFDATA_RLOCK(ifp) rm_rlock(&(ifp)->if_afdata_lock,\ + &_afdata_tracker) +#define IF_AFDATA_WUNLOCK(ifp) rm_wunlock(&(ifp)->if_afdata_lock) +#define IF_AFDATA_RUNLOCK(ifp) rm_runlock(&(ifp)->if_afdata_lock,\ + &_afdata_tracker) #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_DESTROY(ifp) rm_destroy(&(ifp)->if_afdata_lock) -#define IF_AFDATA_LOCK_ASSERT(ifp) rw_assert(&(ifp)->if_afdata_lock, RA_LOCKED) -#define IF_AFDATA_RLOCK_ASSERT(ifp) rw_assert(&(ifp)->if_afdata_lock, RA_RLOCKED) -#define IF_AFDATA_WLOCK_ASSERT(ifp) rw_assert(&(ifp)->if_afdata_lock, RA_WLOCKED) -#define IF_AFDATA_UNLOCK_ASSERT(ifp) rw_assert(&(ifp)->if_afdata_lock, RA_UNLOCKED) +#define IF_AFDATA_LOCK_ASSERT(ifp) rm_assert(&(ifp)->if_afdata_lock, RA_LOCKED) +#define IF_AFDATA_RLOCK_ASSERT(ifp) rm_assert(&(ifp)->if_afdata_lock, RA_RLOCKED) +#define IF_AFDATA_WLOCK_ASSERT(ifp) rm_assert(&(ifp)->if_afdata_lock, RA_WLOCKED) +#define IF_AFDATA_UNLOCK_ASSERT(ifp) rm_assert(&(ifp)->if_afdata_lock, RA_UNLOCKED) /* * 72 was chosen below because it is the size of a TCP/IP diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c index 8bb1badae9d..d6498e0f7cd 100644 --- a/sys/netinet/if_ether.c +++ b/sys/netinet/if_ether.c @@ -444,6 +444,7 @@ arpresolve_full(struct ifnet *ifp, int is_gw, int flags, struct mbuf *m, const struct sockaddr *dst, u_char *desten, uint32_t *pflags, struct llentry **plle) { + IF_AFDATA_RLOCK_TRACKER; struct llentry *la = NULL, *la_tmp; struct mbuf *curr = NULL; struct mbuf *next = NULL; @@ -610,6 +611,7 @@ arpresolve(struct ifnet *ifp, int is_gw, struct mbuf *m, const struct sockaddr *dst, u_char *desten, uint32_t *pflags, struct llentry **plle) { + IF_AFDATA_RLOCK_TRACKER; struct llentry *la = NULL; if (pflags != NULL) @@ -786,6 +788,7 @@ SYSCTL_INT(_net_link_ether_inet, OID_AUTO, allow_multicast, CTLFLAG_RW, static void in_arpinput(struct mbuf *m) { + IF_AFDATA_RLOCK_TRACKER; struct rm_priotracker in_ifa_tracker; struct arphdr *ah; struct ifnet *ifp = m->m_pkthdr.rcvif; diff --git a/sys/netinet6/icmp6.c b/sys/netinet6/icmp6.c index c6084d68b66..e2a04e88dcd 100644 --- a/sys/netinet6/icmp6.c +++ b/sys/netinet6/icmp6.c @@ -2423,6 +2423,7 @@ icmp6_redirect_input(struct mbuf *m, int off) void icmp6_redirect_output(struct mbuf *m0, struct rtentry *rt) { + IF_AFDATA_RLOCK_TRACKER; struct ifnet *ifp; /* my outgoing interface */ struct in6_addr *ifp_ll6; struct in6_addr *router_ll6; diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c index 58c705084b4..2c7a3c7ae0f 100644 --- a/sys/netinet6/nd6.c +++ b/sys/netinet6/nd6.c @@ -1392,6 +1392,7 @@ restart: int nd6_is_addr_neighbor(const struct sockaddr_in6 *addr, struct ifnet *ifp) { + IF_AFDATA_RLOCK_TRACKER; struct llentry *lle; int rc = 0; @@ -1634,6 +1635,7 @@ nd6_rtrequest(int req, struct rtentry *rt, struct rt_addrinfo *info) int nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp) { + IF_AFDATA_RLOCK_TRACKER; struct in6_ndireq *ndi = (struct in6_ndireq *)data; struct in6_nbrinfo *nbi = (struct in6_nbrinfo *)data; struct in6_ndifreq *ndif = (struct in6_ndifreq *)data; @@ -1965,6 +1967,7 @@ void nd6_cache_lladdr(struct ifnet *ifp, struct in6_addr *from, char *lladdr, int lladdrlen, int type, int code) { + IF_AFDATA_RLOCK_TRACKER; struct llentry *ln = NULL, *ln_tmp; int is_newentry; int do_update; @@ -2256,6 +2259,7 @@ nd6_resolve(struct ifnet *ifp, int is_gw, struct mbuf *m, const struct sockaddr *sa_dst, u_char *desten, uint32_t *pflags, struct llentry **plle) { + IF_AFDATA_RLOCK_TRACKER; struct llentry *ln = NULL; const struct sockaddr_in6 *dst6; @@ -2332,6 +2336,7 @@ nd6_resolve_slow(struct ifnet *ifp, int flags, struct mbuf *m, const struct sockaddr_in6 *dst, u_char *desten, uint32_t *pflags, struct llentry **plle) { + IF_AFDATA_RLOCK_TRACKER; struct llentry *lle = NULL, *lle_tmp; struct in6_addr *psrc, src; int send_ns, ll_len; diff --git a/sys/netinet6/nd6_nbr.c b/sys/netinet6/nd6_nbr.c index 61d046459e7..f1501b24472 100644 --- a/sys/netinet6/nd6_nbr.c +++ b/sys/netinet6/nd6_nbr.c @@ -607,6 +607,7 @@ nd6_ns_output(struct ifnet *ifp, const struct in6_addr *saddr6, void nd6_na_input(struct mbuf *m, int off, int icmp6len) { + IF_AFDATA_RLOCK_TRACKER; struct ifnet *ifp = m->m_pkthdr.rcvif; struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *); struct nd_neighbor_advert *nd_na; diff --git a/sys/netinet6/nd6_rtr.c b/sys/netinet6/nd6_rtr.c index 193ce996325..c8c4929f387 100644 --- a/sys/netinet6/nd6_rtr.c +++ b/sys/netinet6/nd6_rtr.c @@ -738,6 +738,7 @@ defrouter_del(struct nd_defrouter *dr) void defrouter_select_fib(int fibnum) { + IF_AFDATA_RLOCK_TRACKER; struct nd_defrouter *dr, *selected_dr, *installed_dr; struct llentry *ln = NULL; @@ -1545,6 +1546,7 @@ end: static struct nd_pfxrouter * find_pfxlist_reachable_router(struct nd_prefix *pr) { + IF_AFDATA_RLOCK_TRACKER; struct nd_pfxrouter *pfxrtr; struct llentry *ln; int canreach; diff --git a/sys/netinet6/scope6.c b/sys/netinet6/scope6.c index a00842e5085..c9b9e5fcc39 100644 --- a/sys/netinet6/scope6.c +++ b/sys/netinet6/scope6.c @@ -207,6 +207,7 @@ scope6_set(struct ifnet *ifp, struct scope6_id *idlist) static int scope6_get(struct ifnet *ifp, struct scope6_id *idlist) { + IF_AFDATA_RLOCK_TRACKER; struct scope6_id *sid; /* We only need to lock the interface's afdata for SID() to work. */ @@ -393,6 +394,7 @@ sa6_recoverscope(struct sockaddr_in6 *sin6) int in6_setscope(struct in6_addr *in6, struct ifnet *ifp, u_int32_t *ret_id) { + IF_AFDATA_RLOCK_TRACKER; int scope; u_int32_t zoneid = 0; struct scope6_id *sid;