| version 1.99.8.1, 2005/06/18 11:13:12 |
version 1.99.8.1.2.1, 2006/03/10 13:19:48 |
| Line 480 pool_init(struct pool *pp, size_t size, |
|
| Line 480 pool_init(struct pool *pp, size_t size, |
|
| flags |= PR_LOGGING; |
flags |= PR_LOGGING; |
| #endif |
#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) |
if (palloc == NULL) |
| palloc = &pool_allocator_kmem; |
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 */ |
#endif /* POOL_SUBPAGE */ |
| if ((palloc->pa_flags & PA_INITIALIZED) == 0) { |
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; |
palloc->pa_pagesz = PAGE_SIZE; |
| #endif /* POOL_SUBPAGE */ |
|
| } |
|
| |
|
| TAILQ_INIT(&palloc->pa_list); |
TAILQ_INIT(&palloc->pa_list); |
| |
|
| Line 2136 pool_cache_reclaim(struct pool_cache *pc |
|
| Line 2120 pool_cache_reclaim(struct pool_cache *pc |
|
| void *pool_page_alloc(struct pool *, int); |
void *pool_page_alloc(struct pool *, int); |
| void pool_page_free(struct pool *, void *); |
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 = { |
struct pool_allocator pool_allocator_kmem = { |
| pool_page_alloc, pool_page_free, 0, |
pool_page_alloc, pool_page_free, 0, |
| }; |
}; |
| |
#endif |
| |
|
| void *pool_page_alloc_nointr(struct pool *, int); |
void *pool_page_alloc_nointr(struct pool *, int); |
| void pool_page_free_nointr(struct pool *, void *); |
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 = { |
struct pool_allocator pool_allocator_nointr = { |
| pool_page_alloc_nointr, pool_page_free_nointr, 0, |
pool_page_alloc_nointr, pool_page_free_nointr, 0, |
| }; |
}; |
| |
#endif |
| |
|
| #ifdef POOL_SUBPAGE |
#ifdef POOL_SUBPAGE |
| void *pool_subpage_alloc(struct pool *, int); |
void *pool_subpage_alloc(struct pool *, int); |
| void pool_subpage_free(struct pool *, void *); |
void pool_subpage_free(struct pool *, void *); |
| |
|
| struct pool_allocator pool_allocator_kmem_subpage = { |
struct pool_allocator pool_allocator_kmem = { |
| pool_subpage_alloc, pool_subpage_free, 0, |
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, |
| }; |
}; |
| #endif /* POOL_SUBPAGE */ |
#endif /* POOL_SUBPAGE */ |
| |
|
| Line 2330 pool_subpage_free(struct pool *pp, void |
|
| Line 2333 pool_subpage_free(struct pool *pp, void |
|
| |
|
| /* We don't provide a real nointr allocator. Maybe later. */ |
/* We don't provide a real nointr allocator. Maybe later. */ |
| void * |
void * |
| pool_page_alloc_nointr(struct pool *pp, int flags) |
pool_subpage_alloc_nointr(struct pool *pp, int flags) |
| { |
{ |
| |
|
| return (pool_subpage_alloc(pp, flags)); |
return (pool_subpage_alloc(pp, flags)); |
| } |
} |
| |
|
| void |
void |
| pool_page_free_nointr(struct pool *pp, void *v) |
pool_subpage_free_nointr(struct pool *pp, void *v) |
| { |
{ |
| |
|
| pool_subpage_free(pp, v); |
pool_subpage_free(pp, v); |
| } |
} |
| #else |
#endif /* POOL_SUBPAGE */ |
| void * |
void * |
| pool_page_alloc_nointr(struct pool *pp, int flags) |
pool_page_alloc_nointr(struct pool *pp, int flags) |
| { |
{ |
| Line 2358 pool_page_free_nointr(struct pool *pp, v |
|
| Line 2361 pool_page_free_nointr(struct pool *pp, v |
|
| |
|
| uvm_km_free_poolpage_cache(kernel_map, (vaddr_t) v); |
uvm_km_free_poolpage_cache(kernel_map, (vaddr_t) v); |
| } |
} |
| #endif /* POOL_SUBPAGE */ |
|