Index: subr_pool.c =================================================================== RCS file: /cvs/src/sys/kern/subr_pool.c,v retrieving revision 1.221 diff -u -p -r1.221 subr_pool.c --- subr_pool.c 18 Jan 2018 18:08:51 -0000 1.221 +++ subr_pool.c 6 Feb 2018 20:43:47 -0000 @@ -917,6 +917,8 @@ pool_p_alloc(struct pool *pp, int flags, struct pool_page_header *ph; struct pool_item *pi; caddr_t addr; + unsigned int order; + int o; int n; pl_assert_unlocked(pp, &pp->pr_lock); @@ -951,10 +953,19 @@ pool_p_alloc(struct pool *pp, int flags, #endif /* DIAGNOSTIC */ n = pp->pr_itemsperpage; + o = 32; while (n--) { pi = (struct pool_item *)addr; pi->pi_magic = POOL_IMAGIC(ph, pi); - XSIMPLEQ_INSERT_TAIL(&ph->ph_items, pi, pi_list); + + if (o == 32) { + order = arc4random(); + o = 0; + } + if (ISSET(order, 1 << o++)) + XSIMPLEQ_INSERT_TAIL(&ph->ph_items, pi, pi_list); + else + XSIMPLEQ_INSERT_HEAD(&ph->ph_items, pi, pi_list); #ifdef DIAGNOSTIC if (POOL_PHPOISON(ph))