at the moment pages can be freed on a pool_put call and from the gc.
it is a bit unfair that pool_get may end up doing the heavy lifting
of allocating a pool page and pool_put wont have to do an equivalent
free, but we should try and minimise the amount of work done in
these hot paths.
ok?
Index: subr_pool.c
===================================================================
RCS file: /cvs/src/sys/kern/subr_pool.c,v
retrieving revision 1.204
diff -u -p -r1.204 subr_pool.c
--- subr_pool.c 21 Nov 2016 01:44:06 -0000 1.204
+++ subr_pool.c 22 Nov 2016 02:43:23 -0000
@@ -707,7 +707,7 @@ void
pool_put(struct pool *pp, void *v)
{
struct pool_item *pi = v;
- struct pool_page_header *ph, *freeph = NULL;
+ struct pool_page_header *ph;
#ifdef DIAGNOSTIC
if (v == NULL)
@@ -770,17 +770,7 @@ pool_put(struct pool *pp, void *v)
pp->pr_nout--;
pp->pr_nput++;
- /* is it time to free a page? */
- if (pp->pr_nidle > pp->pr_maxpages &&
- (ph = TAILQ_FIRST(&pp->pr_emptypages)) != NULL &&
- (ticks - ph->ph_tick) > (hz * pool_wait_free)) {
- freeph = ph;
- pool_p_remove(pp, freeph);
- }
mtx_leave(&pp->pr_mtx);
-
- if (freeph != NULL)
- pool_p_free(pp, freeph);
if (!TAILQ_EMPTY(&pp->pr_requests)) {
mtx_enter(&pp->pr_requests_mtx);