move the internal accounting for a page being removed closer to removing
it and before freeing it instead of after.  also, rmpage updates
curpage, so we don't need to do that twice.

Index: subr_pool.c
===================================================================
RCS file: /cvs/src/sys/kern/subr_pool.c,v
retrieving revision 1.106
diff -u -p -r1.106 subr_pool.c
--- subr_pool.c 5 Jul 2011 20:00:18 -0000       1.106
+++ subr_pool.c 5 Jul 2011 20:01:48 -0000
@@ -226,6 +226,10 @@ pr_rmpage(struct pool *pp, struct pool_i
        LIST_REMOVE(ph, ph_pagelist);
        if ((pp->pr_roflags & PR_PHINPAGE) == 0)
                RB_REMOVE(phtree, &pp->pr_phtree, ph);
+       pp->pr_npages--;
+       pp->pr_npagefree++;
+       pool_update_curpage(pp);
+
        if (pq) {
                LIST_INSERT_HEAD(pq, ph, ph_pagelist);
        } else {
@@ -233,10 +237,6 @@ pr_rmpage(struct pool *pp, struct pool_i
                if ((pp->pr_roflags & PR_PHINPAGE) == 0)
                        pool_put(&phpool, ph);
        }
-       pp->pr_npages--;
-       pp->pr_npagefree++;
-
-       pool_update_curpage(pp);
 }
 
 /*
@@ -804,8 +804,8 @@ pool_do_put(struct pool *pp, void *v)
                } else {
                        LIST_REMOVE(ph, ph_pagelist);
                        LIST_INSERT_HEAD(&pp->pr_emptypages, ph, ph_pagelist);
+                       pool_update_curpage(pp);
                }
-               pool_update_curpage(pp);
        }
 
        /*

Reply via email to