kern/165863
Gleb Smirnoff
glebius at FreeBSD.org
Tue Apr 10 06:54:39 UTC 2012
Thanks, Ryan!
On Thu, Mar 29, 2012 at 05:59:38PM -0400, Ryan Stone wrote:
R> Ok, I think that I have an approach that will work. This is heavily
R> based off of glebius' proposal. The big difference is that instead of
R> initializing the arptimer callout with the ll_entry's lock, I
R> initialize it with the if_afdata_lock. This eliminates the LOR
R> problem in arptimer. It also nicely prevents any races between
R> arptimer and in_lltable_prefix_free. Either arptimer will run and
R> ensure that prefix_free can never see an entry that arptimer is in the
R> process of destroying, or prefix_free will stop the callout before
R> arptimer gets a chance to start.
R>
R> I'll admit that it feels a bit dirty to be doing anything if the ifp
R> at this level, but I'd argue that is an artifact of using a lock in
R> the ifp to protect the lltable.
R>
R> The patch below is not yet complete; it doesn't fix the IPv6 case.
R> IPv6 is looking much trickier as when an NDP entry is timed out
R> nd6_free() will drop the LLE_WLOCK, acquire the IF_AFDATA_LOCK and
R> then re-acquire the LLE_WLOCK. It's not immediately clear to me what
R> the best way to handle the race between in6_lltable_prefix_free and
R> nd6_llinfo_timer is. Holding the afdata_lock across all of
R> nd6_llinfo_timer feels like overkill.
R>
R> Any comments on this approach? Am I going in the wrong direction?
Looks okay from my viewpoint. Have you stress tested it? My snap patch
definitely had problems, AFAIR.
If this patch fixes panics observed by kern/165863 and passes stress
testing, then it should be committed ASAP, and shouldn't depend on
IPv6 part.
--
Totus tuus, Glebius.
More information about the freebsd-net
mailing list