rework art_walk so it will behave in an mpsafe world.
authordlg <dlg@openbsd.org>
Wed, 22 Jun 2016 06:32:32 +0000 (06:32 +0000)
committerdlg <dlg@openbsd.org>
Wed, 22 Jun 2016 06:32:32 +0000 (06:32 +0000)
commit03a6f99fe60a2c52ecca533c039dcc83aed6887f
tree1347e73b933a211926cbae4b61cbe8135adb43b1
parent523b82f1fc011c628d0986d2dffd464ce8c9d2eb
rework art_walk so it will behave in an mpsafe world.

art_walk now explicitly takes the same lock used to serialise change
made via rtable_insert and _delete, so it can safely adjust the
refcnts on tables while it recurses into them. they need to still
exist when returning out of the recursion.

it uses srps to access nodes and drops the lock before calling the
callback function. this is because some callbacks sleep (eg, copyout
in the sysctl code that dumps an rtable to userland), which you
shouldnt hold a lock accross. other callbacks attempt to modify
the rtable (eg, marking routes as down when then interface theyre
on goes down), which tries to take the lock again, which probably
wont work in the future.

ok jmatthew@ mpi@
sys/net/art.c
sys/net/rtable.c