Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/kern/subr_pool.c,v retrieving revision 1.138.2.3 retrieving revision 1.139 diff -u -p -r1.138.2.3 -r1.139 --- src/sys/kern/subr_pool.c 2007/12/13 05:06:01 1.138.2.3 +++ src/sys/kern/subr_pool.c 2007/12/11 19:07:27 1.139 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_pool.c,v 1.138.2.3 2007/12/13 05:06:01 yamt Exp $ */ +/* $NetBSD: subr_pool.c,v 1.139 2007/12/11 19:07:27 ad Exp $ */ /*- * Copyright (c) 1997, 1999, 2000, 2002, 2007 The NetBSD Foundation, Inc. @@ -38,9 +38,8 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.138.2.3 2007/12/13 05:06:01 yamt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.139 2007/12/11 19:07:27 ad Exp $"); -#include "opt_ddb.h" #include "opt_pool.h" #include "opt_poollog.h" #include "opt_lockdebug.h" @@ -102,7 +101,7 @@ static void pool_page_free_meta(struct p /* allocator for pool metadata */ struct pool_allocator pool_allocator_meta = { pool_page_alloc_meta, pool_page_free_meta, - .pa_backingmapptr = &kernel_map, + .pa_backingmapptr = &kmem_map, }; /* # of seconds to retain page after last use */ @@ -128,7 +127,6 @@ struct pool_item_header { void * ph_page; /* this page's address */ struct timeval ph_time; /* last referenced */ uint16_t ph_nmissing; /* # of chunks in use */ - uint16_t ph_off; /* start offset in page */ union { /* !PR_NOTOUCH */ struct { @@ -137,11 +135,13 @@ struct pool_item_header { } phu_normal; /* PR_NOTOUCH */ struct { - pool_item_bitmap_t phu_bitmap[1]; + uint16_t phu_off; /* start offset in page */ + pool_item_bitmap_t phu_bitmap[]; } phu_notouch; } ph_u; }; #define ph_itemlist ph_u.phu_normal.phu_itemlist +#define ph_off ph_u.phu_notouch.phu_off #define ph_bitmap ph_u.phu_notouch.phu_bitmap struct pool_item { @@ -412,24 +412,6 @@ phtree_compare(struct pool_item_header * SPLAY_PROTOTYPE(phtree, pool_item_header, ph_node, phtree_compare); SPLAY_GENERATE(phtree, pool_item_header, ph_node, phtree_compare); -static inline struct pool_item_header * -pr_find_pagehead_noalign(struct pool *pp, void *v) -{ - struct pool_item_header *ph, tmp; - - tmp.ph_page = (void *)(uintptr_t)v; - ph = SPLAY_FIND(phtree, &pp->pr_phtree, &tmp); - if (ph == NULL) { - ph = SPLAY_ROOT(&pp->pr_phtree); - if (ph != NULL && phtree_compare(&tmp, ph) >= 0) { - ph = SPLAY_NEXT(phtree, &pp->pr_phtree, ph); - } - KASSERT(ph == NULL || phtree_compare(&tmp, ph) < 0); - } - - return ph; -} - /* * Return the pool page header based on item address. */ @@ -439,7 +421,15 @@ pr_find_pagehead(struct pool *pp, void * struct pool_item_header *ph, tmp; if ((pp->pr_roflags & PR_NOALIGN) != 0) { - ph = pr_find_pagehead_noalign(pp, v); + tmp.ph_page = (void *)(uintptr_t)v; + ph = SPLAY_FIND(phtree, &pp->pr_phtree, &tmp); + if (ph == NULL) { + ph = SPLAY_ROOT(&pp->pr_phtree); + if (ph != NULL && phtree_compare(&tmp, ph) >= 0) { + ph = SPLAY_NEXT(phtree, &pp->pr_phtree, ph); + } + KASSERT(ph == NULL || phtree_compare(&tmp, ph) < 0); + } } else { void *page = (void *)((uintptr_t)v & pp->pr_alloc->pa_pagemask); @@ -800,7 +790,7 @@ pool_init(struct pool *pp, size_t size, #ifdef POOL_DIAGNOSTIC if (flags & PR_LOGGING) { - if (kernel_map == NULL || + if (kmem_map == NULL || (pp->pr_log = malloc(pool_logsize * sizeof(struct pool_log), M_TEMP, M_NOWAIT)) == NULL) pp->pr_roflags &= ~PR_LOGGING; @@ -1446,8 +1436,7 @@ pool_prime_page(struct pool *pp, void *s /* * Color this page. */ - ph->ph_off = pp->pr_curcolor; - cp = (char *)cp + ph->ph_off; + cp = (char *)cp + pp->pr_curcolor; if ((pp->pr_curcolor += align) > pp->pr_maxcolor) pp->pr_curcolor = 0; @@ -2122,20 +2111,6 @@ pool_cache_bootstrap(pool_cache_t pc, si void pool_cache_destroy(pool_cache_t pc) { - - pool_cache_bootstrap_destroy(pc); - pool_put(&cache_pool, pc); -} - -/* - * pool_cache_bootstrap_destroy: - * - * Kernel-private version of pool_cache_destroy(). - * Destroy a pool cache initialized by pool_cache_bootstrap. - */ -void -pool_cache_bootstrap_destroy(pool_cache_t pc) -{ struct pool *pp = &pc->pc_pool; pool_cache_cpu_t *cc; pcg_t *pcg; @@ -2175,6 +2150,7 @@ pool_cache_bootstrap_destroy(pool_cache_ /* Finally, destroy it. */ mutex_destroy(&pc->pc_lock); pool_destroy(pp); + pool_put(&cache_pool, pc); } /* @@ -2766,12 +2742,12 @@ void pool_page_free(struct pool *, void #ifdef POOL_SUBPAGE struct pool_allocator pool_allocator_kmem_fullpage = { pool_page_alloc, pool_page_free, 0, - .pa_backingmapptr = &kernel_map, + .pa_backingmapptr = &kmem_map, }; #else struct pool_allocator pool_allocator_kmem = { pool_page_alloc, pool_page_free, 0, - .pa_backingmapptr = &kernel_map, + .pa_backingmapptr = &kmem_map, }; #endif @@ -2796,7 +2772,7 @@ void pool_subpage_free(struct pool *, vo struct pool_allocator pool_allocator_kmem = { pool_subpage_alloc, pool_subpage_free, POOL_SUBPAGE, - .pa_backingmapptr = &kernel_map, + .pa_backingmapptr = &kmem_map, }; void *pool_subpage_alloc_nointr(struct pool *, int); @@ -2804,7 +2780,7 @@ void pool_subpage_free_nointr(struct poo struct pool_allocator pool_allocator_nointr = { pool_subpage_alloc, pool_subpage_free, POOL_SUBPAGE, - .pa_backingmapptr = &kernel_map, + .pa_backingmapptr = &kmem_map, }; #endif /* POOL_SUBPAGE */ @@ -2842,14 +2818,14 @@ pool_page_alloc(struct pool *pp, int fla { bool waitok = (flags & PR_WAITOK) ? true : false; - return ((void *) uvm_km_alloc_poolpage_cache(kernel_map, waitok)); + return ((void *) uvm_km_alloc_poolpage_cache(kmem_map, waitok)); } void pool_page_free(struct pool *pp, void *v) { - uvm_km_free_poolpage_cache(kernel_map, (vaddr_t) v); + uvm_km_free_poolpage_cache(kmem_map, (vaddr_t) v); } static void * @@ -2857,14 +2833,14 @@ pool_page_alloc_meta(struct pool *pp, in { bool waitok = (flags & PR_WAITOK) ? true : false; - return ((void *) uvm_km_alloc_poolpage(kernel_map, waitok)); + return ((void *) uvm_km_alloc_poolpage(kmem_map, waitok)); } static void pool_page_free_meta(struct pool *pp, void *v) { - uvm_km_free_poolpage(kernel_map, (vaddr_t) v); + uvm_km_free_poolpage(kmem_map, (vaddr_t) v); } #ifdef POOL_SUBPAGE @@ -2910,49 +2886,3 @@ pool_page_free_nointr(struct pool *pp, v uvm_km_free_poolpage_cache(kernel_map, (vaddr_t) v); } - -#if defined(DDB) -static bool -pool_in_page(struct pool *pp, struct pool_item_header *ph, uintptr_t addr) -{ - - return (uintptr_t)ph->ph_page <= addr && - addr < (uintptr_t)ph->ph_page + pp->pr_alloc->pa_pagesz; -} - -void -pool_whatis(uintptr_t addr, void (*pr)(const char *, ...)) -{ - struct pool *pp; - - LIST_FOREACH(pp, &pool_head, pr_poollist) { - struct pool_item_header *ph; - uintptr_t item; - - if ((pp->pr_roflags & PR_PHINPAGE) != 0) { - LIST_FOREACH(ph, &pp->pr_fullpages, ph_pagelist) { - if (pool_in_page(pp, ph, addr)) { - goto found; - } - } - LIST_FOREACH(ph, &pp->pr_partpages, ph_pagelist) { - if (pool_in_page(pp, ph, addr)) { - goto found; - } - } - continue; - } else { - ph = pr_find_pagehead_noalign(pp, (void *)addr); - if (ph == NULL || !pool_in_page(pp, ph, addr)) { - continue; - } - } -found: - item = (uintptr_t)ph->ph_page + ph->ph_off; - item = item + rounddown(addr - item, pp->pr_size); - (*pr)("%p is %p+%zu from POOL '%s'\n", - (void *)addr, item, (size_t)(addr - item), - pp->pr_wchan); - } -} -#endif /* defined(DDB) */