pool doesn't need to use tailq. simpleq is good enough. list
operations are now using 50% fewer pointers, and therefore must be
twice as fast. zoom! well, it does reduce memory of elements some,
which is always nice.

entirely mechanical change, except only in pool_destroy does it
matter. i don't even know how to test this because pool_destroy is
such an infrequent operation.

bonus removal of allocator list which isn't even used.

Index: kern/subr_pool.c
===================================================================
RCS file: /cvs/src/sys/kern/subr_pool.c,v
retrieving revision 1.114
diff -u -p -r1.114 subr_pool.c
--- kern/subr_pool.c    17 Feb 2013 17:39:29 -0000      1.114
+++ kern/subr_pool.c    22 Mar 2013 05:22:36 -0000
@@ -58,7 +58,7 @@
  */
 
 /* List of all pools */
-TAILQ_HEAD(,pool) pool_head = TAILQ_HEAD_INITIALIZER(pool_head);
+SIMPLEQ_HEAD(,pool) pool_head = SIMPLEQ_HEAD_INITIALIZER(pool_head);
 
 /* Private pool for page header structures */
 struct pool phpool;
@@ -67,7 +67,7 @@ struct pool_item_header {
        /* Page headers */
        LIST_ENTRY(pool_item_header)
                                ph_pagelist;    /* pool page list */
-       TAILQ_HEAD(,pool_item)  ph_itemlist;    /* chunk list for this page */
+       SIMPLEQ_HEAD(,pool_item) ph_itemlist;   /* chunk list for this page */
        RB_ENTRY(pool_item_header)
                                ph_node;        /* Off-page page headers */
        int                     ph_nmissing;    /* # of chunks in use */
@@ -82,7 +82,7 @@ struct pool_item {
        u_int32_t pi_magic;
 #endif
        /* Other entries use only this list entry */
-       TAILQ_ENTRY(pool_item)  pi_list;
+       SIMPLEQ_ENTRY(pool_item)        pi_list;
 };
 
 #ifdef DEADBEEF1
@@ -406,7 +406,7 @@ pool_init(struct pool *pp, size_t size, 
        pp->pr_crange = &kp_dirty;
 
        /* Insert this into the list of all pools. */
-       TAILQ_INSERT_HEAD(&pool_head, pp, pr_poollist);
+       SIMPLEQ_INSERT_HEAD(&pool_head, pp, pr_poollist);
 }
 
 void
@@ -423,6 +423,7 @@ void
 pool_destroy(struct pool *pp)
 {
        struct pool_item_header *ph;
+       struct pool *prev, *iter;
 
 #ifdef DIAGNOSTIC
        if (pp->pr_nout != 0)
@@ -436,7 +437,19 @@ pool_destroy(struct pool *pp)
        KASSERT(LIST_EMPTY(&pp->pr_partpages));
 
        /* Remove from global pool list */
-       TAILQ_REMOVE(&pool_head, pp, pr_poollist);
+       if (pp == SIMPLEQ_FIRST(&pool_head))
+               SIMPLEQ_REMOVE_HEAD(&pool_head, pr_poollist);
+       else {
+               prev = SIMPLEQ_FIRST(&pool_head);
+               SIMPLEQ_FOREACH(iter, &pool_head, pr_poollist) {
+                       if (iter == pp) {
+                               SIMPLEQ_REMOVE_AFTER(&pool_head, prev,
+                                   pr_poollist);
+                               break;
+                       }
+                       prev = iter;
+               }
+       }
 }
 
 struct pool_item_header *
@@ -616,7 +629,7 @@ startover:
                /* Start the allocation process over. */
                goto startover;
        }
-       if ((v = pi = TAILQ_FIRST(&ph->ph_itemlist)) == NULL) {
+       if ((v = pi = SIMPLEQ_FIRST(&ph->ph_itemlist)) == NULL) {
                panic("pool_do_get: %s: page empty", pp->pr_wchan);
        }
 #ifdef DIAGNOSTIC
@@ -650,7 +663,7 @@ startover:
        /*
         * Remove from item list.
         */
-       TAILQ_REMOVE(&ph->ph_itemlist, pi, pi_list);
+       SIMPLEQ_REMOVE_HEAD(&ph->ph_itemlist, pi_list);
        pp->pr_nitems--;
        pp->pr_nout++;
        if (ph->ph_nmissing == 0) {
@@ -668,7 +681,7 @@ startover:
                LIST_INSERT_HEAD(&pp->pr_partpages, ph, ph_pagelist);
        }
        ph->ph_nmissing++;
-       if (TAILQ_EMPTY(&ph->ph_itemlist)) {
+       if (SIMPLEQ_EMPTY(&ph->ph_itemlist)) {
 #ifdef DIAGNOSTIC
                if (ph->ph_nmissing != pp->pr_itemsperpage) {
                        panic("pool_do_get: %s: nmissing inconsistent",
@@ -775,7 +788,7 @@ pool_do_put(struct pool *pp, void *v)
 #endif /* POOL_DEBUG */
 #endif /* DIAGNOSTIC */
 
-       TAILQ_INSERT_HEAD(&ph->ph_itemlist, pi, pi_list);
+       SIMPLEQ_INSERT_HEAD(&ph->ph_itemlist, pi, pi_list);
        ph->ph_nmissing--;
        pp->pr_nitems++;
        pp->pr_nout--;
@@ -881,7 +894,7 @@ pool_prime_page(struct pool *pp, caddr_t
         * Insert page header.
         */
        LIST_INSERT_HEAD(&pp->pr_emptypages, ph, ph_pagelist);
-       TAILQ_INIT(&ph->ph_itemlist);
+       SIMPLEQ_INIT(&ph->ph_itemlist);
        ph->ph_page = storage;
        ph->ph_pagesize = pp->pr_alloc->pa_pagesz;
        ph->ph_nmissing = 0;
@@ -916,7 +929,7 @@ pool_prime_page(struct pool *pp, caddr_t
                KASSERT(((((vaddr_t)pi) + ioff) & (align - 1)) == 0);
 
                /* Insert on page list */
-               TAILQ_INSERT_TAIL(&ph->ph_itemlist, pi, pi_list);
+               SIMPLEQ_INSERT_TAIL(&ph->ph_itemlist, pi, pi_list);
 
 #ifdef DIAGNOSTIC
                pi->pi_magic = PI_MAGIC;
@@ -1108,7 +1121,7 @@ pool_reclaim_all(void)
        int             s;
 
        s = splhigh();
-       TAILQ_FOREACH(pp, &pool_head, pr_poollist)
+       SIMPLEQ_FOREACH(pp, &pool_head, pr_poollist)
                pool_reclaim(pp);
        splx(s);
 }
@@ -1141,7 +1154,7 @@ pool_print_pagelist(struct pool_pagelist
                (*pr)("\t\tpage %p, nmissing %d\n",
                    ph->ph_page, ph->ph_nmissing);
 #ifdef DIAGNOSTIC
-               TAILQ_FOREACH(pi, &ph->ph_itemlist, pi_list) {
+               SIMPLEQ_FOREACH(pi, &ph->ph_itemlist, pi_list) {
                        if (pi->pi_magic != PI_MAGIC) {
                                (*pr)("\t\t\titem %p, magic 0x%x\n",
                                    pi, pi->pi_magic);
@@ -1230,7 +1243,7 @@ db_show_all_pools(db_expr_t expr, int ha
                db_printf("%-12s %18s %18s\n",
                    "Name", "Address", "Allocator");
 
-       TAILQ_FOREACH(pp, &pool_head, pr_poollist) {
+       SIMPLEQ_FOREACH(pp, &pool_head, pr_poollist) {
                if (mode == 'a') {
                        db_printf("%-12s %18p %18p\n", pp->pr_wchan, pp,
                            pp->pr_alloc);
@@ -1295,9 +1308,9 @@ pool_chk_page(struct pool *pp, struct po
                return 1;
        }
 
-       for (pi = TAILQ_FIRST(&ph->ph_itemlist), n = 0;
+       for (pi = SIMPLEQ_FIRST(&ph->ph_itemlist), n = 0;
             pi != NULL;
-            pi = TAILQ_NEXT(pi,pi_list), n++) {
+            pi = SIMPLEQ_NEXT(pi,pi_list), n++) {
 
 #ifdef DIAGNOSTIC
                if (pi->pi_magic != PI_MAGIC) {
@@ -1395,7 +1408,7 @@ pool_walk(struct pool *pp, int full,
                n = ph->ph_nmissing;
 
                do {
-                       TAILQ_FOREACH(pi, &ph->ph_itemlist, pi_list) {
+                       SIMPLEQ_FOREACH(pi, &ph->ph_itemlist, pi_list) {
                                if (cp == (caddr_t)pi)
                                        break;
                        }
@@ -1447,7 +1460,7 @@ sysctl_dopool(int *name, u_int namelen, 
 
        s = splvm();
 
-       TAILQ_FOREACH(pp, &pool_head, pr_poollist) {
+       SIMPLEQ_FOREACH(pp, &pool_head, pr_poollist) {
                npools++;
                if (lookfor == pp->pr_serial) {
                        foundpool = pp;
Index: sys/pool.h
===================================================================
RCS file: /cvs/src/sys/sys/pool.h,v
retrieving revision 1.42
diff -u -p -r1.42 pool.h
--- sys/pool.h  24 Dec 2012 19:43:11 -0000      1.42
+++ sys/pool.h  22 Mar 2013 05:20:26 -0000
@@ -63,7 +63,7 @@ LIST_HEAD(pool_pagelist,pool_item_header
 
 struct pool {
        struct mutex    pr_mtx;
-       TAILQ_ENTRY(pool)
+       SIMPLEQ_ENTRY(pool)
                        pr_poollist;
        struct pool_pagelist
                        pr_emptypages;  /* Empty pages */
@@ -87,7 +87,6 @@ struct pool {
                                           items */
        unsigned int    pr_serial;      /* unique serial number of the pool */
        struct pool_allocator *pr_alloc;/* backend allocator */
-       TAILQ_ENTRY(pool) pr_alloc_list;/* list of pools using this allocator */
        const char      *pr_wchan;      /* tsleep(9) identifier */
        unsigned int    pr_flags;       /* r/w flags */
        unsigned int    pr_roflags;     /* r/o flags */

Reply via email to