Module Name: src Committed By: martin Date: Fri Jan 26 15:41:13 UTC 2018
Modified Files: src/sys/kern [netbsd-8]: kern_timeout.c src/sys/netinet [netbsd-8]: if_arp.c src/sys/netinet6 [netbsd-8]: nd6_nbr.c Log Message: Pull up following revision(s) (requested by ozaki-r in ticket #511): sys/kern/kern_timeout.c: revision 1.54 sys/netinet6/nd6_nbr.c: revision 1.141 sys/netinet6/nd6_nbr.c: revision 1.144 sys/netinet/if_arp.c: revision 1.256 Fix a deadlock on callout_halt of nd6_dad_timer We must not call callout_halt of nd6_dad_timer with holding nd6_dad_lock because the lock is taken in nd6_dad_timer. Once softnet_lock goes away, we can pass the lock to callout_halt, but for now we cannot. Make DAD destructions (MP-)safe with callout_stop arp_dad_stoptimer and nd6_dad_stoptimer can be called with or without softnet_lock held and unfortunately we have no easy way to statically know which. So it is hard to use callout_halt there. To address the situation, we use callout_stop to make the code safe. The new approach copes with the issue by delegating the destruction of a callout to callout itself, which allows us to not wait the callout to finish. This can be done thanks to that DAD objects are separated from other data such as ifa. The approach is suggested by riastradh@ Proposed on tech-kern@ and tech-net@ Sanity-check if interlock is held when it's passed To generate a diff of this commit: cvs rdiff -u -r1.52 -r1.52.2.1 src/sys/kern/kern_timeout.c cvs rdiff -u -r1.250.2.4 -r1.250.2.5 src/sys/netinet/if_arp.c cvs rdiff -u -r1.138.6.1 -r1.138.6.2 src/sys/netinet6/nd6_nbr.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.