Index: sys/dev/random/fenestrasX/fx_pool.c =================================================================== --- sys/dev/random/fenestrasX/fx_pool.c +++ sys/dev/random/fenestrasX/fx_pool.c @@ -158,6 +158,9 @@ [RANDOM_SWI] = { .entc_cls = &fxrng_lo_push, }, + [RANDOM_CALLOUT] = { + .entc_cls = &fxrng_lo_push, + }, [RANDOM_FS_ATIME] = { .entc_cls = &fxrng_lo_push, }, Index: sys/dev/random/random_harvestq.c =================================================================== --- sys/dev/random/random_harvestq.c +++ sys/dev/random/random_harvestq.c @@ -348,6 +348,7 @@ [RANDOM_NET_NG] = "NET_NG", [RANDOM_INTERRUPT] = "INTERRUPT", [RANDOM_SWI] = "SWI", + [RANDOM_CALLOUT] = "CALLOUT", [RANDOM_FS_ATIME] = "FS_ATIME", [RANDOM_UMA] = "UMA", /* ENVIRONMENTAL_END */ [RANDOM_PURE_OCTEON] = "PURE_OCTEON", /* PURE_START */ Index: sys/kern/kern_timeout.c =================================================================== --- sys/kern/kern_timeout.c +++ sys/kern/kern_timeout.c @@ -57,6 +57,7 @@ #include #include #include +#include #include #include #include @@ -430,6 +431,11 @@ void callout_process(sbintime_t now) { + struct callout_entropy { + struct callout_cpu *cc; + struct thread *td; + sbintime_t now; + } entropy; struct callout *tmp, *tmpn; struct callout_cpu *cc; struct callout_list *sc; @@ -545,6 +551,11 @@ avg_lockcalls_dir += (lockcalls_dir * 1000 - avg_lockcalls_dir) >> 8; #endif if (!TAILQ_EMPTY(&cc->cc_expireq)) { + entropy.cc = cc; + entropy.td = curthread; + entropy.now = now; + random_harvest_queue(&entropy, sizeof(entropy), RANDOM_CALLOUT); + td = cc->cc_thread; if (TD_AWAITING_INTR(td)) { thread_lock_block_wait(td); Index: sys/sys/random.h =================================================================== --- sys/sys/random.h +++ sys/sys/random.h @@ -84,6 +84,7 @@ RANDOM_NET_NG, RANDOM_INTERRUPT, RANDOM_SWI, + RANDOM_CALLOUT, RANDOM_FS_ATIME, RANDOM_UMA, /* Special!! UMA/SLAB Allocator */ RANDOM_ENVIRONMENTAL_END = RANDOM_UMA,