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;
}