PERFORCE change 37475 for review
Sam Leffler
sam at FreeBSD.org
Wed Sep 3 21:23:44 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=37475
Change 37475 by sam at sam_ebb on 2003/09/03 21:23:33
Don't hold a reference in rt_parent with a reference count,
it is unnecessary and we cannot safely remove it. Specifically
when deleting an rtentry from which cloned entries were
created rtrequest1 recurses down the tree deleting cloned
entries. But this is done while holding the parent rtentry
lock. This means that when the backpointer in rt_parent is
reclaimed we must recursively lock the parent (which fails
because the mutex is non-recursive). It's not safe to do
the clone purging first or to allow recursion on the lock.
The better solution appears to be to depend on the ordered
relationship between the parent rtentry and all cloned items
to insure rt_parent is valid.
This was (briefly) discussed with Garrett who initially added
the refcnt bump in rev 1.19. FWIW BSD/OS does not hold use
the refcnt.
Affected files ...
.. //depot/projects/netperf/sys/net/route.c#7 edit
Differences ...
==== //depot/projects/netperf/sys/net/route.c#7 (text+ko) ====
@@ -262,8 +262,7 @@
*/
if (rt->rt_ifa)
IFAFREE(rt->rt_ifa);
- if (rt->rt_parent)
- RTFREE(rt->rt_parent);
+ rt->rt_parent = NULL; /* NB: no refcnt on parent */
/*
* The key is separatly alloc'd so free it (see rt_setgate()).
@@ -729,9 +728,17 @@
rt->rt_rmx = (*ret_nrt)->rt_rmx; /* copy metrics */
rt->rt_rmx.rmx_pksent = 0; /* reset packet counter */
if ((*ret_nrt)->rt_flags & (RTF_CLONING | RTF_PRCLONING)) {
+ /*
+ * NB: We do not bump the refcnt on the parent
+ * entry under the assumption that it will
+ * remain so long as we do. This is
+ * important when deleting the parent route
+ * as this operation requires traversing
+ * the tree to delete all clones and futzing
+ * with refcnts requires us to double-lock
+ * parent through this back reference.
+ */
rt->rt_parent = *ret_nrt;
- /* XXX locking */
- (*ret_nrt)->rt_refcnt++;
}
}
More information about the p4-projects
mailing list