The current pool cache code increases the number of items that can be cached locally in response to lock contention. This patch adds a tweak that lowers the number when contention does not occur. The idea is to let resources be returned to the common pool when pressure on the cache has decreased.
This change alone does not move elements from the cache to the common pool. The cache has to have some activity for the moving to happen. It is likely that `pr_cache_items' does not settle on a single value but oscillates within some range. In my testing, I have not seen any wild swings that would indicate positive feedback in the process. The adjustments are constant per step and happen relatively rarely. OK? Index: kern/subr_pool.c =================================================================== RCS file: src/sys/kern/subr_pool.c,v retrieving revision 1.217 diff -u -p -r1.217 subr_pool.c --- kern/subr_pool.c 23 Jun 2017 01:21:55 -0000 1.217 +++ kern/subr_pool.c 5 Jul 2017 09:27:40 -0000 @@ -1957,6 +1957,9 @@ pool_cache_gc(struct pool *pp) if ((contention - pp->pr_cache_contention_prev) > 8 /* magic */) { if ((ncpusfound * 8 * 2) <= pp->pr_cache_nitems) pp->pr_cache_items += 8; + } else if ((contention - pp->pr_cache_contention_prev) == 0) { + if (pp->pr_cache_items > 8) + pp->pr_cache_items--; } pp->pr_cache_contention_prev = contention; }