Rework pflowioctl() lock dances.
authormvs <mvs@openbsd.org>
Sat, 16 Dec 2023 22:16:02 +0000 (22:16 +0000)
committermvs <mvs@openbsd.org>
Sat, 16 Dec 2023 22:16:02 +0000 (22:16 +0000)
commit0b9ea2785a44171b5f54de1d7806f4a554e50e47
tree511e1b843a2d4406443ada4ac9365866f51c251e
parent142bcb0a647144dbe52800187e69850cf755aa16
Rework pflowioctl() lock dances.

Release netlock and take `sc_lock' rwlock(9) just in the beginning of
pflowioctl() and do corresponding operations in the end. Use `sc_lock'
to protect `sc_dying'.

We need to release netlock not only to keep locks order with `sc_lock'
rwlock(9), but also because pflowioctl() calls some operations like
socreate() or soclose() on udp(4) socket. Current implementation has
many relocking places which breaks atomicy, so merge them into one.

The `sc_lock' rwlock(9) is taken during all pflowioctl() call, so
`sc_dying' atomicy is not broken.

Not the ideal solution, but better then we have now.

Tested by Hrvoje Popovski.

Discussed with and ok from sashan
sys/net/if_pflow.c
sys/net/if_pflow.h