svn commit: r311695 - head/sys/netinet6
Mark Johnston
markj at FreeBSD.org
Sun Jan 8 18:46:02 UTC 2017
Author: markj
Date: Sun Jan 8 18:46:00 2017
New Revision: 311695
URL: https://svnweb.freebsd.org/changeset/base/311695
Log:
Release the ND6 list lock before making a prefix off-link in nd6_timer().
Reported by: Jim <BM-2cWfdfG5CJsquqkJyry7hZT9LypbSEWEkQ at bitmessage.ch>
X-MFC With: r306829
Modified:
head/sys/netinet6/nd6.c
Modified: head/sys/netinet6/nd6.c
==============================================================================
--- head/sys/netinet6/nd6.c Sun Jan 8 18:33:13 2017 (r311694)
+++ head/sys/netinet6/nd6.c Sun Jan 8 18:46:00 2017 (r311695)
@@ -910,7 +910,7 @@ nd6_timer(void *arg)
struct nd_defrouter *dr, *ndr;
struct nd_prefix *pr, *npr;
struct in6_ifaddr *ia6, *nia6;
- bool onlink_locked;
+ uint64_t genid;
TAILQ_INIT(&drq);
LIST_INIT(&prl);
@@ -1022,7 +1022,6 @@ nd6_timer(void *arg)
}
ND6_WLOCK();
- onlink_locked = false;
restart:
LIST_FOREACH_SAFE(pr, &V_nd_prefix, ndpr_entry, npr) {
/*
@@ -1045,22 +1044,19 @@ restart:
continue;
}
if ((pr->ndpr_stateflags & NDPRF_ONLINK) != 0) {
- if (!onlink_locked) {
- onlink_locked = ND6_ONLINK_TRYLOCK();
- if (!onlink_locked) {
- ND6_WUNLOCK();
- ND6_ONLINK_LOCK();
- onlink_locked = true;
- ND6_WLOCK();
- goto restart;
- }
- }
+ genid = V_nd6_list_genid;
+ nd6_prefix_ref(pr);
+ ND6_WUNLOCK();
+ ND6_ONLINK_LOCK();
(void)nd6_prefix_offlink(pr);
+ ND6_ONLINK_UNLOCK();
+ ND6_WLOCK();
+ nd6_prefix_rele(pr);
+ if (genid != V_nd6_list_genid)
+ goto restart;
}
}
ND6_WUNLOCK();
- if (onlink_locked)
- ND6_ONLINK_UNLOCK();
while ((pr = LIST_FIRST(&prl)) != NULL) {
LIST_REMOVE(pr, ndpr_entry);
More information about the svn-src-head
mailing list