bring back r1.673: replace SRP with SMR in the if_idxmap.
authordlg <dlg@openbsd.org>
Thu, 10 Nov 2022 17:17:47 +0000 (17:17 +0000)
committerdlg <dlg@openbsd.org>
Thu, 10 Nov 2022 17:17:47 +0000 (17:17 +0000)
commit56d528e2caa42278860e5e3699c08266883f87b6
tree3f62cbcebfeabec9d3b5570b1967592e4a84b522
parenta9f5e6b57f9bd3b596944f96f5d93de89ddc204a
bring back r1.673: replace SRP with SMR in the if_idxmap.

when i first wrote if_idxmap i didn't realise (and no one thought
to tell me) that index 0 was special and means "no interface", so
while here use the 0th slot in the interface map to store the length
of the map instead of prepending the map with a length field.
if_get() now special cases index 0 and returns NULL directly. this
also means the size of the map is now always a power of 2, which
is a nicer fit with what the kernel malloc aprovides.

the problem with r1.673 that hrvoje popovski found was that attaching
a lot of interfaces during autoconf would lock up when growing the
map called smr_barrier. the fix in this diff is to (ab)use the
usedidx bitmap to store an smr_entry and defer the freeing of the
interface pointer map with it.

tested by hrvoje popovski
tweaks and ok visa@
sys/net/if.c