Looking at the use of pserialze functions, you've got a single data structure (bpf_iflist) that is at some times covered by bpf_iflist_mtx and others not. That's a bad design. Ideally the data structure should only be covered by one locking mechanism so you need to choose whether it is pserialize or mutex. Most of the work seems easy enough to do with mutex - except for the copyout section: that will take more thought. If you can't make it work with just one locking mechanism then ensure that you always use the same constructs for all of the code paths that work with bpf_iflist (none are time critical.)
Cheers, Darren