etherbridge_map was way too clever, so simplify it.
authordlg <dlg@openbsd.org>
Mon, 5 Jul 2021 04:17:41 +0000 (04:17 +0000)
committerdlg <dlg@openbsd.org>
Mon, 5 Jul 2021 04:17:41 +0000 (04:17 +0000)
commitdd76c598e3c4115465b3230dcbe7a412fc2a9b5b
treea6e964b9b90a8326c70250691c523ffc08a1cfc8
parente7df8c5b5d6d5ca7cf413d5da02796f0d9895efe
etherbridge_map was way too clever, so simplify it.

the code tried to carry state from the quick smr based lookup through
to the actual map update under the mutex, but this led to refcnt
leaks, and logic errors. the simplification is that if the smr based
checks say the map needs updating, we prepare the update and then
forget what we learnt inside the smr critical section and redo them
under the mutex again.

entries in an etherbridge map are either in it or they aren't, so
we don't need to refcnt them. this means the thing that takes an
entry out of the map becomes directly responsible for destroy it,
so they can do the smr call or barrier directly rather than via a
refcnt.

found by hrvoje popovski while testing the stack running in parallel,
and fix tested by him too.
ok sashan@
sys/net/if_etherbridge.c
sys/net/if_etherbridge.h