Index: sys/netinet6/frag6.c =================================================================== --- sys/netinet6/frag6.c +++ sys/netinet6/frag6.c @@ -883,8 +883,9 @@ * IPv6 reassembling timer processing; * if a timer expires on a reassembly queue, discard it. */ +struct callout frag6_callout; void -frag6_slowtimo(void) +frag6_slowtimo(void *arg __unused) { VNET_ITERATOR_DECL(vnet_iter); struct ip6qhead *head; @@ -892,7 +893,7 @@ uint32_t bucket; if (atomic_load_int(&frag6_nfrags) == 0) - return; + goto done; VNET_LIST_RLOCK_NOSLEEP(); VNET_FOREACH(vnet_iter) { @@ -949,6 +950,8 @@ CURVNET_RESTORE(); } VNET_LIST_RUNLOCK_NOSLEEP(); +done: + callout_reset(&frag6_callout, hz / 2, frag6_slowtimo, NULL); } /* Index: sys/netinet6/in6_proto.c =================================================================== --- sys/netinet6/in6_proto.c +++ sys/netinet6/in6_proto.c @@ -144,7 +144,6 @@ .pr_domain = &inet6domain, .pr_protocol = IPPROTO_IPV6, .pr_flags = PR_CAPATTACH, - .pr_slowtimo = frag6_slowtimo, .pr_drain = frag6_drain, }, { Index: sys/netinet6/ip6_input.c =================================================================== --- sys/netinet6/ip6_input.c +++ sys/netinet6/ip6_input.c @@ -295,6 +295,9 @@ IP6PROTO_REGISTER(IPPROTO_SCTP, sctp6_input, sctp6_ctlinput); #endif + callout_init(&frag6_callout, 1); + callout_reset(&frag6_callout, hz / 2, frag6_slowtimo, NULL); + netisr_register(&ip6_nh); #ifdef RSS netisr_register(&ip6_direct_nh); Index: sys/netinet6/ip6_var.h =================================================================== --- sys/netinet6/ip6_var.h +++ sys/netinet6/ip6_var.h @@ -391,7 +391,8 @@ void frag6_init(void); void frag6_destroy(void); int frag6_input(struct mbuf **, int *, int); -void frag6_slowtimo(void); +extern struct callout frag6_callout; +void frag6_slowtimo(void *); void frag6_drain(void); void rip6_init(void);