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.110.2.2 retrieving revision 1.111 diff -u -p -r1.110.2.2 -r1.111 --- src/sys/kern/subr_pool.c 2006/03/01 09:28:46 1.110.2.2 +++ src/sys/kern/subr_pool.c 2006/01/26 15:07:25 1.111 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_pool.c,v 1.110.2.2 2006/03/01 09:28:46 yamt Exp $ */ +/* $NetBSD: subr_pool.c,v 1.111 2006/01/26 15:07:25 christos Exp $ */ /*- * Copyright (c) 1997, 1999, 2000 The NetBSD Foundation, Inc. @@ -38,7 +38,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.110.2.2 2006/03/01 09:28:46 yamt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.111 2006/01/26 15:07:25 christos Exp $"); #include "opt_pool.h" #include "opt_poollog.h" @@ -482,19 +482,35 @@ pool_init(struct pool *pp, size_t size, flags |= PR_LOGGING; #endif +#ifdef POOL_SUBPAGE + /* + * XXX We don't provide a real `nointr' back-end + * yet; all sub-pages come from a kmem back-end. + * maybe some day... + */ + if (palloc == NULL) { + extern struct pool_allocator pool_allocator_kmem_subpage; + palloc = &pool_allocator_kmem_subpage; + } + /* + * We'll assume any user-specified back-end allocator + * will deal with sub-pages, or simply don't care. + */ +#else if (palloc == NULL) palloc = &pool_allocator_kmem; -#ifdef POOL_SUBPAGE - if (size > palloc->pa_pagesz) { - if (palloc == &pool_allocator_kmem) - palloc = &pool_allocator_kmem_fullpage; - else if (palloc == &pool_allocator_nointr) - palloc = &pool_allocator_nointr_fullpage; - } #endif /* POOL_SUBPAGE */ if ((palloc->pa_flags & PA_INITIALIZED) == 0) { - if (palloc->pa_pagesz == 0) + if (palloc->pa_pagesz == 0) { +#ifdef POOL_SUBPAGE + if (palloc == &pool_allocator_kmem) + palloc->pa_pagesz = PAGE_SIZE; + else + palloc->pa_pagesz = POOL_SUBPAGE; +#else palloc->pa_pagesz = PAGE_SIZE; +#endif /* POOL_SUBPAGE */ + } TAILQ_INIT(&palloc->pa_list); @@ -2174,42 +2190,23 @@ pool_cache_reclaim(struct pool_cache *pc void *pool_page_alloc(struct pool *, int); void pool_page_free(struct pool *, void *); -#ifdef POOL_SUBPAGE -struct pool_allocator pool_allocator_kmem_fullpage = { - pool_page_alloc, pool_page_free, 0, -}; -#else struct pool_allocator pool_allocator_kmem = { pool_page_alloc, pool_page_free, 0, }; -#endif void *pool_page_alloc_nointr(struct pool *, int); void pool_page_free_nointr(struct pool *, void *); -#ifdef POOL_SUBPAGE -struct pool_allocator pool_allocator_nointr_fullpage = { - pool_page_alloc_nointr, pool_page_free_nointr, 0, -}; -#else struct pool_allocator pool_allocator_nointr = { pool_page_alloc_nointr, pool_page_free_nointr, 0, }; -#endif #ifdef POOL_SUBPAGE void *pool_subpage_alloc(struct pool *, int); void pool_subpage_free(struct pool *, void *); -struct pool_allocator pool_allocator_kmem = { - pool_subpage_alloc, pool_subpage_free, POOL_SUBPAGE, -}; - -void *pool_subpage_alloc_nointr(struct pool *, int); -void pool_subpage_free_nointr(struct pool *, void *); - -struct pool_allocator pool_allocator_nointr = { - pool_subpage_alloc, pool_subpage_free, POOL_SUBPAGE, +struct pool_allocator pool_allocator_kmem_subpage = { + pool_subpage_alloc, pool_subpage_free, 0, }; #endif /* POOL_SUBPAGE */ @@ -2385,19 +2382,19 @@ pool_subpage_free(struct pool *pp, void /* We don't provide a real nointr allocator. Maybe later. */ void * -pool_subpage_alloc_nointr(struct pool *pp, int flags) +pool_page_alloc_nointr(struct pool *pp, int flags) { return (pool_subpage_alloc(pp, flags)); } void -pool_subpage_free_nointr(struct pool *pp, void *v) +pool_page_free_nointr(struct pool *pp, void *v) { pool_subpage_free(pp, v); } -#endif /* POOL_SUBPAGE */ +#else void * pool_page_alloc_nointr(struct pool *pp, int flags) { @@ -2412,3 +2409,4 @@ pool_page_free_nointr(struct pool *pp, v uvm_km_free_poolpage_cache(kernel_map, (vaddr_t) v); } +#endif /* POOL_SUBPAGE */