Hi, MP safe process timeouts were landed to the tree, so time to test them with network stack :) Diff below makes tdb and ids garbage collector timeout handlers running without kernel lock.
Not for commit, just share this for tests if someone interesting. Index: sys/netinet/ip_ipsp.c =================================================================== RCS file: /cvs/src/sys/netinet/ip_ipsp.c,v retrieving revision 1.277 diff -u -p -r1.277 ip_ipsp.c --- sys/netinet/ip_ipsp.c 11 Oct 2023 22:13:16 -0000 1.277 +++ sys/netinet/ip_ipsp.c 12 Oct 2023 18:07:18 -0000 @@ -124,7 +124,8 @@ void ipsp_ids_gc(void *); LIST_HEAD(, ipsec_ids) ipsp_ids_gc_list = LIST_HEAD_INITIALIZER(ipsp_ids_gc_list); /* [F] */ struct timeout ipsp_ids_gc_timeout = - TIMEOUT_INITIALIZER_FLAGS(ipsp_ids_gc, NULL, KCLOCK_NONE, TIMEOUT_PROC); + TIMEOUT_INITIALIZER_FLAGS(ipsp_ids_gc, NULL, KCLOCK_NONE, + TIMEOUT_PROC | TIMEOUT_MPSAFE); static inline int ipsp_ids_cmp(const struct ipsec_ids *, const struct ipsec_ids *); @@ -1100,10 +1101,14 @@ tdb_alloc(u_int rdomain) tdbp->tdb_counters = counters_alloc(tdb_ncounters); /* Initialize timeouts. */ - timeout_set_proc(&tdbp->tdb_timer_tmo, tdb_timeout, tdbp); - timeout_set_proc(&tdbp->tdb_first_tmo, tdb_firstuse, tdbp); - timeout_set_proc(&tdbp->tdb_stimer_tmo, tdb_soft_timeout, tdbp); - timeout_set_proc(&tdbp->tdb_sfirst_tmo, tdb_soft_firstuse, tdbp); + timeout_set_flags(&tdbp->tdb_timer_tmo, tdb_timeout, tdbp, + KCLOCK_NONE, TIMEOUT_PROC | TIMEOUT_MPSAFE); + timeout_set_flags(&tdbp->tdb_first_tmo, tdb_firstuse, tdbp, + KCLOCK_NONE, TIMEOUT_PROC | TIMEOUT_MPSAFE); + timeout_set_flags(&tdbp->tdb_stimer_tmo, tdb_soft_timeout, tdbp, + KCLOCK_NONE, TIMEOUT_PROC | TIMEOUT_MPSAFE); + timeout_set_flags(&tdbp->tdb_sfirst_tmo, tdb_soft_firstuse, tdbp, + KCLOCK_NONE, TIMEOUT_PROC | TIMEOUT_MPSAFE); return tdbp; }