| version 1.86, 2003/03/16 08:06:51 |
version 1.87, 2003/04/09 18:22:13 |
| Line 1488 pool_print1(struct pool *pp, const char |
|
| Line 1488 pool_print1(struct pool *pp, const char |
|
| pc->pc_hits, pc->pc_misses, pc->pc_ngroups, pc->pc_nitems); |
pc->pc_hits, pc->pc_misses, pc->pc_ngroups, pc->pc_nitems); |
| TAILQ_FOREACH(pcg, &pc->pc_grouplist, pcg_list) { |
TAILQ_FOREACH(pcg, &pc->pc_grouplist, pcg_list) { |
| (*pr)("\t\tgroup %p: avail %d\n", pcg, pcg->pcg_avail); |
(*pr)("\t\tgroup %p: avail %d\n", pcg, pcg->pcg_avail); |
| for (i = 0; i < PCG_NOBJECTS; i++) |
for (i = 0; i < PCG_NOBJECTS; i++) { |
| (*pr)("\t\t\t%p\n", pcg->pcg_objects[i]); |
if (pcg->pcg_objects[i].pcgo_pa != |
| |
POOL_PADDR_INVALID) { |
| |
(*pr)("\t\t\t%p, 0x%llx\n", |
| |
pcg->pcg_objects[i].pcgo_va, |
| |
(unsigned long long) |
| |
pcg->pcg_objects[i].pcgo_pa); |
| |
} else { |
| |
(*pr)("\t\t\t%p\n", |
| |
pcg->pcg_objects[i].pcgo_va); |
| |
} |
| |
} |
| } |
} |
| } |
} |
| |
|
| Line 1618 pool_cache_destroy(struct pool_cache *pc |
|
| Line 1628 pool_cache_destroy(struct pool_cache *pc |
|
| } |
} |
| |
|
| static __inline void * |
static __inline void * |
| pcg_get(struct pool_cache_group *pcg) |
pcg_get(struct pool_cache_group *pcg, paddr_t *pap) |
| { |
{ |
| void *object; |
void *object; |
| u_int idx; |
u_int idx; |
| Line 1627 pcg_get(struct pool_cache_group *pcg) |
|
| Line 1637 pcg_get(struct pool_cache_group *pcg) |
|
| KASSERT(pcg->pcg_avail != 0); |
KASSERT(pcg->pcg_avail != 0); |
| idx = --pcg->pcg_avail; |
idx = --pcg->pcg_avail; |
| |
|
| KASSERT(pcg->pcg_objects[idx] != NULL); |
KASSERT(pcg->pcg_objects[idx].pcgo_va != NULL); |
| object = pcg->pcg_objects[idx]; |
object = pcg->pcg_objects[idx].pcgo_va; |
| pcg->pcg_objects[idx] = NULL; |
if (pap != NULL) |
| |
*pap = pcg->pcg_objects[idx].pcgo_pa; |
| |
pcg->pcg_objects[idx].pcgo_va = NULL; |
| |
|
| return (object); |
return (object); |
| } |
} |
| |
|
| static __inline void |
static __inline void |
| pcg_put(struct pool_cache_group *pcg, void *object) |
pcg_put(struct pool_cache_group *pcg, void *object, paddr_t pa) |
| { |
{ |
| u_int idx; |
u_int idx; |
| |
|
| KASSERT(pcg->pcg_avail < PCG_NOBJECTS); |
KASSERT(pcg->pcg_avail < PCG_NOBJECTS); |
| idx = pcg->pcg_avail++; |
idx = pcg->pcg_avail++; |
| |
|
| KASSERT(pcg->pcg_objects[idx] == NULL); |
KASSERT(pcg->pcg_objects[idx].pcgo_va == NULL); |
| pcg->pcg_objects[idx] = object; |
pcg->pcg_objects[idx].pcgo_va = object; |
| |
pcg->pcg_objects[idx].pcgo_pa = pa; |
| } |
} |
| |
|
| /* |
/* |
| * pool_cache_get: |
* pool_cache_get{,_paddr}: |
| * |
* |
| * Get an object from a pool cache. |
* Get an object from a pool cache (optionally returning |
| |
* the physical address of the object). |
| */ |
*/ |
| void * |
void * |
| pool_cache_get(struct pool_cache *pc, int flags) |
pool_cache_get_paddr(struct pool_cache *pc, int flags, paddr_t *pap) |
| { |
{ |
| struct pool_cache_group *pcg; |
struct pool_cache_group *pcg; |
| void *object; |
void *object; |
| Line 1687 pool_cache_get(struct pool_cache *pc, in |
|
| Line 1701 pool_cache_get(struct pool_cache *pc, in |
|
| return (NULL); |
return (NULL); |
| } |
} |
| } |
} |
| |
if (object != NULL && pap != NULL) { |
| |
#ifdef POOL_VTOPHYS |
| |
*pap = POOL_VTOPHYS(object); |
| |
#else |
| |
*pap = POOL_PADDR_INVALID; |
| |
#endif |
| |
} |
| return (object); |
return (object); |
| } |
} |
| |
|
| have_group: |
have_group: |
| pc->pc_hits++; |
pc->pc_hits++; |
| pc->pc_nitems--; |
pc->pc_nitems--; |
| object = pcg_get(pcg); |
object = pcg_get(pcg, pap); |
| |
|
| if (pcg->pcg_avail == 0) |
if (pcg->pcg_avail == 0) |
| pc->pc_allocfrom = NULL; |
pc->pc_allocfrom = NULL; |
| Line 1704 pool_cache_get(struct pool_cache *pc, in |
|
| Line 1725 pool_cache_get(struct pool_cache *pc, in |
|
| } |
} |
| |
|
| /* |
/* |
| * pool_cache_put: |
* pool_cache_put{,_paddr}: |
| * |
* |
| * Put an object back to the pool cache. |
* Put an object back to the pool cache (optionally caching the |
| |
* physical address of the object). |
| */ |
*/ |
| void |
void |
| pool_cache_put(struct pool_cache *pc, void *object) |
pool_cache_put_paddr(struct pool_cache *pc, void *object, paddr_t pa) |
| { |
{ |
| struct pool_cache_group *pcg; |
struct pool_cache_group *pcg; |
| int s; |
int s; |
| Line 1752 pool_cache_put(struct pool_cache *pc, vo |
|
| Line 1774 pool_cache_put(struct pool_cache *pc, vo |
|
| |
|
| have_group: |
have_group: |
| pc->pc_nitems++; |
pc->pc_nitems++; |
| pcg_put(pcg, object); |
pcg_put(pcg, object, pa); |
| |
|
| if (pcg->pcg_avail == PCG_NOBJECTS) |
if (pcg->pcg_avail == PCG_NOBJECTS) |
| pc->pc_freeto = NULL; |
pc->pc_freeto = NULL; |
| Line 1794 pool_cache_do_invalidate(struct pool_cac |
|
| Line 1816 pool_cache_do_invalidate(struct pool_cac |
|
| npcg = TAILQ_NEXT(pcg, pcg_list); |
npcg = TAILQ_NEXT(pcg, pcg_list); |
| while (pcg->pcg_avail != 0) { |
while (pcg->pcg_avail != 0) { |
| pc->pc_nitems--; |
pc->pc_nitems--; |
| object = pcg_get(pcg); |
object = pcg_get(pcg, NULL); |
| if (pcg->pcg_avail == 0 && pc->pc_allocfrom == pcg) |
if (pcg->pcg_avail == 0 && pc->pc_allocfrom == pcg) |
| pc->pc_allocfrom = NULL; |
pc->pc_allocfrom = NULL; |
| if (pc->pc_dtor != NULL) |
if (pc->pc_dtor != NULL) |