version 1.190.2.1, 2012/04/17 00:08:28 |
version 1.191, 2012/01/27 19:48:40 |
Line 531 pr_rmpage(struct pool *pp, struct pool_i |
|
Line 531 pr_rmpage(struct pool *pp, struct pool_i |
|
void |
void |
pool_subsystem_init(void) |
pool_subsystem_init(void) |
{ |
{ |
size_t size; |
|
int idx; |
int idx; |
|
size_t size; |
|
|
mutex_init(&pool_head_lock, MUTEX_DEFAULT, IPL_NONE); |
mutex_init(&pool_head_lock, MUTEX_DEFAULT, IPL_NONE); |
mutex_init(&pool_allocator_lock, MUTEX_DEFAULT, IPL_NONE); |
mutex_init(&pool_allocator_lock, MUTEX_DEFAULT, IPL_NONE); |
Line 2718 void pool_page_free(struct pool *, void |
|
Line 2718 void pool_page_free(struct pool *, void |
|
|
|
#ifdef POOL_SUBPAGE |
#ifdef POOL_SUBPAGE |
struct pool_allocator pool_allocator_kmem_fullpage = { |
struct pool_allocator pool_allocator_kmem_fullpage = { |
.pa_alloc = pool_page_alloc, |
pool_page_alloc, pool_page_free, 0 |
.pa_free = pool_page_free, |
|
.pa_pagesz = 0 |
|
}; |
}; |
#else |
#else |
struct pool_allocator pool_allocator_kmem = { |
struct pool_allocator pool_allocator_kmem = { |
Line 2730 struct pool_allocator pool_allocator_kme |
|
Line 2728 struct pool_allocator pool_allocator_kme |
|
}; |
}; |
#endif |
#endif |
|
|
|
void *pool_page_alloc_nointr(struct pool *, int); |
|
void pool_page_free_nointr(struct pool *, void *); |
|
|
#ifdef POOL_SUBPAGE |
#ifdef POOL_SUBPAGE |
struct pool_allocator pool_allocator_nointr_fullpage = { |
struct pool_allocator pool_allocator_nointr_fullpage = { |
.pa_alloc = pool_page_alloc, |
pool_page_alloc_nointr, pool_page_free_nointr, 0, |
.pa_free = pool_page_free, |
|
.pa_pagesz = 0 |
|
}; |
}; |
#else |
#else |
struct pool_allocator pool_allocator_nointr = { |
struct pool_allocator pool_allocator_nointr = { |
Line 2749 void *pool_subpage_alloc(struct pool *, |
|
Line 2748 void *pool_subpage_alloc(struct pool *, |
|
void pool_subpage_free(struct pool *, void *); |
void pool_subpage_free(struct pool *, void *); |
|
|
struct pool_allocator pool_allocator_kmem = { |
struct pool_allocator pool_allocator_kmem = { |
.pa_alloc = pool_subpage_alloc, |
pool_subpage_alloc, pool_subpage_free, POOL_SUBPAGE, |
.pa_free = pool_subpage_free, |
|
.pa_pagesz = POOL_SUBPAGE |
|
}; |
}; |
|
|
|
void *pool_subpage_alloc_nointr(struct pool *, int); |
|
void pool_subpage_free_nointr(struct pool *, void *); |
|
|
struct pool_allocator pool_allocator_nointr = { |
struct pool_allocator pool_allocator_nointr = { |
.pa_alloc = pool_subpage_alloc, |
pool_subpage_alloc, pool_subpage_free, POOL_SUBPAGE, |
.pa_free = pool_subpage_free, |
|
.pa_pagesz = POOL_SUBPAGE |
|
}; |
}; |
#endif /* POOL_SUBPAGE */ |
#endif /* POOL_SUBPAGE */ |
|
|
Line 2793 pool_allocator_free(struct pool *pp, voi |
|
Line 2791 pool_allocator_free(struct pool *pp, voi |
|
void * |
void * |
pool_page_alloc(struct pool *pp, int flags) |
pool_page_alloc(struct pool *pp, int flags) |
{ |
{ |
const vm_flag_t vflags = (flags & PR_WAITOK) ? VM_SLEEP: VM_NOSLEEP; |
bool waitok = (flags & PR_WAITOK) ? true : false; |
|
int rc; |
vmem_addr_t va; |
vmem_addr_t va; |
int ret; |
|
|
|
ret = uvm_km_kmem_alloc(kmem_va_arena, pp->pr_alloc->pa_pagesz, |
rc = uvm_km_kmem_alloc(kmem_va_arena, |
vflags | VM_INSTANTFIT, &va); |
pp->pr_alloc->pa_pagesz, |
|
((waitok ? VM_SLEEP : VM_NOSLEEP) | VM_INSTANTFIT), &va); |
|
|
return ret ? NULL : (void *)va; |
if (rc != 0) |
|
return NULL; |
|
else |
|
return (void *)va; |
} |
} |
|
|
void |
void |
Line 2813 pool_page_free(struct pool *pp, void *v) |
|
Line 2815 pool_page_free(struct pool *pp, void *v) |
|
static void * |
static void * |
pool_page_alloc_meta(struct pool *pp, int flags) |
pool_page_alloc_meta(struct pool *pp, int flags) |
{ |
{ |
const vm_flag_t vflags = (flags & PR_WAITOK) ? VM_SLEEP: VM_NOSLEEP; |
bool waitok = (flags & PR_WAITOK) ? true : false; |
vmem_addr_t va; |
int rc; |
int ret; |
vmem_addr_t addr; |
|
|
ret = vmem_alloc(kmem_meta_arena, pp->pr_alloc->pa_pagesz, |
rc = vmem_alloc(kmem_meta_arena, pp->pr_alloc->pa_pagesz, |
vflags | VM_INSTANTFIT, &va); |
(waitok ? VM_SLEEP : VM_NOSLEEP) | VM_INSTANTFIT, &addr); |
|
|
return ret ? NULL : (void *)va; |
if (rc != 0) |
|
return 0; |
|
else |
|
return (void *)addr; |
} |
} |
|
|
static void |
static void |
pool_page_free_meta(struct pool *pp, void *v) |
pool_page_free_meta(struct pool *pp, void *v) |
{ |
{ |
|
|
vmem_free(kmem_meta_arena, (vmem_addr_t)v, pp->pr_alloc->pa_pagesz); |
vmem_free(kmem_meta_arena, (vmem_addr_t)v, |
|
pp->pr_alloc->pa_pagesz); |
} |
} |
|
|
#ifdef POOL_SUBPAGE |
#ifdef POOL_SUBPAGE |
Line 2844 pool_subpage_free(struct pool *pp, void |
|
Line 2850 pool_subpage_free(struct pool *pp, void |
|
pool_put(&psppool, v); |
pool_put(&psppool, v); |
} |
} |
|
|
|
/* We don't provide a real nointr allocator. Maybe later. */ |
|
void * |
|
pool_subpage_alloc_nointr(struct pool *pp, int flags) |
|
{ |
|
|
|
return (pool_subpage_alloc(pp, flags)); |
|
} |
|
|
|
void |
|
pool_subpage_free_nointr(struct pool *pp, void *v) |
|
{ |
|
|
|
pool_subpage_free(pp, v); |
|
} |
#endif /* POOL_SUBPAGE */ |
#endif /* POOL_SUBPAGE */ |
|
|
#if defined(DDB) |
#if defined(DDB) |