Index: kern/subr_pool.c =================================================================== RCS file: /cvs/src/sys/kern/subr_pool.c,v retrieving revision 1.163 diff -u -p -r1.163 subr_pool.c --- kern/subr_pool.c 13 Oct 2014 00:12:51 -0000 1.163 +++ kern/subr_pool.c 28 Oct 2014 03:05:50 -0000 @@ -299,8 +299,7 @@ pool_init(struct pool *pp, size_t size, */ space = POOL_INPGHDR(pp) ? pp->pr_phoffset : pp->pr_pgsize; space -= pp->pr_itemsperpage * pp->pr_size; - pp->pr_maxcolor = (space / align) * align; - pp->pr_curcolor = 0; + pp->pr_maxcolors = (space / align) + 1; pp->pr_nget = 0; pp->pr_nfail = 0; @@ -750,6 +749,8 @@ pool_p_alloc(struct pool *pp, int flags) XSIMPLEQ_INIT(&ph->ph_itemlist); ph->ph_page = addr; + ph->ph_colored = addr + + arc4random_uniform(pp->pr_maxcolors) * pp->pr_align; ph->ph_nmissing = 0; arc4random_buf(&ph->ph_magic, sizeof(ph->ph_magic)); #ifdef DIAGNOSTIC @@ -760,6 +761,7 @@ pool_p_alloc(struct pool *pp, int flags) CLR(ph->ph_magic, POOL_MAGICBIT); #endif /* DIAGNOSTIC */ + addr = ph->ph_colored; n = pp->pr_itemsperpage; while (n--) { pi = (struct pool_item *)addr; @@ -996,8 +998,8 @@ pool_print_pagelist(struct pool_pagelist struct pool_item *pi; LIST_FOREACH(ph, pl, ph_pagelist) { - (*pr)("\t\tpage %p, nmissing %d\n", - ph->ph_page, ph->ph_nmissing); + (*pr)("\t\tpage %p, color %p, nmissing %d\n", + ph->ph_page, ph->ph_colored, ph->ph_nmissing); XSIMPLEQ_FOREACH(pi, &ph->ph_itemlist, pi_list) { if (pi->pi_magic != POOL_IMAGIC(ph, pi)) { (*pr)("\t\t\titem %p, magic 0x%lx\n", @@ -1021,8 +1023,8 @@ pool_print1(struct pool *pp, const char modif++; } - (*pr)("POOL %s: size %u, align %u, roflags 0x%08x\n", - pp->pr_wchan, pp->pr_size, pp->pr_align, + (*pr)("POOL %s: size %u, align %u, maxcolors %u, roflags 0x%08x\n", + pp->pr_wchan, pp->pr_size, pp->pr_align, pp->pr_maxcolors, pp->pr_roflags); (*pr)("\talloc %p\n", pp->pr_alloc); (*pr)("\tminitems %u, minpages %u, maxpages %u, npages %u\n", Index: sys/pool.h =================================================================== RCS file: /cvs/src/sys/sys/pool.h,v retrieving revision 1.53 diff -u -p -r1.53 pool.h --- sys/pool.h 22 Sep 2014 01:04:58 -0000 1.53 +++ sys/pool.h 28 Oct 2014 03:05:50 -0000 @@ -128,8 +128,7 @@ struct pool { RB_HEAD(phtree, pool_item_header) pr_phtree; - int pr_maxcolor; /* Cache colouring */ - int pr_curcolor; + u_int pr_maxcolors; /* Cache colouring */ int pr_phoffset; /* Offset in page of page header */ /*