Right now for pfsync(4), but later it will need it to serialize access to PF data structures.
splassert: ip_output: want 1 have 0 ip_output() at ip_output+0x7d pfsync_sendout() at pfsync_sendout+0x499 pfsync_q_ins() at pfsync_q_ins+0x78 pf_remove_state() at pf_remove_state+0x5d pf_purge_expired_states() at pf_purge_expired_states+0x7b pf_purge_thread() at pf_purge_thread+0x5c ok? Index: net/pf.c =================================================================== RCS file: /cvs/src/sys/net/pf.c,v retrieving revision 1.1009 diff -u -p -r1.1009 pf.c --- net/pf.c 29 Dec 2016 13:01:48 -0000 1.1009 +++ net/pf.c 6 Jan 2017 11:18:41 -0000 @@ -1184,7 +1184,7 @@ pf_purge_thread(void *v) for (;;) { tsleep(pf_purge_thread, PWAIT, "pftm", 1 * hz); - s = splsoftnet(); + NET_LOCK(s); /* process a fraction of the state table every second */ pf_purge_expired_states(1 + (pf_status.states @@ -1198,7 +1198,7 @@ pf_purge_thread(void *v) nloops = 0; } - splx(s); + NET_UNLOCK(s); } }