| version 1.108, 2005/12/01 13:21:05 |
version 1.109, 2005/12/20 15:52:14 |
| Line 929 pool_get(struct pool *pp, int flags) |
|
| Line 929 pool_get(struct pool *pp, int flags) |
|
| /* |
/* |
| * Wait for items to be returned to this pool. |
* Wait for items to be returned to this pool. |
| * |
* |
| * XXX: maybe we should wake up once a second and |
* wake up once a second and try again, |
| * try again? |
* as the check in pool_cache_put_paddr() is racy. |
| */ |
*/ |
| pp->pr_flags |= PR_WANTED; |
pp->pr_flags |= PR_WANTED; |
| /* PA_WANTED is already set on the allocator. */ |
/* PA_WANTED is already set on the allocator. */ |
| pr_leave(pp); |
pr_leave(pp); |
| ltsleep(pp, PSWP, pp->pr_wchan, 0, &pp->pr_slock); |
ltsleep(pp, PSWP, pp->pr_wchan, hz, &pp->pr_slock); |
| pr_enter(pp, file, line); |
pr_enter(pp, file, line); |
| goto startover; |
goto startover; |
| } |
} |
| Line 2019 pool_cache_put_paddr(struct pool_cache * |
|
| Line 2019 pool_cache_put_paddr(struct pool_cache * |
|
| struct pool_cache_group *pcg; |
struct pool_cache_group *pcg; |
| int s; |
int s; |
| |
|
| |
if (__predict_false((pc->pc_pool->pr_flags & PR_WANTED) != 0)) { |
| |
goto destruct; |
| |
} |
| |
|
| simple_lock(&pc->pc_slock); |
simple_lock(&pc->pc_slock); |
| |
|
| pcg = LIST_FIRST(&pc->pc_partgroups); |
pcg = LIST_FIRST(&pc->pc_partgroups); |
| Line 2040 pool_cache_put_paddr(struct pool_cache * |
|
| Line 2044 pool_cache_put_paddr(struct pool_cache * |
|
| pcg = pool_get(&pcgpool, PR_NOWAIT); |
pcg = pool_get(&pcgpool, PR_NOWAIT); |
| splx(s); |
splx(s); |
| if (pcg == NULL) { |
if (pcg == NULL) { |
| |
destruct: |
| |
|
| /* |
/* |
| * Unable to allocate a cache group; destruct the object |
* Unable to allocate a cache group; destruct the object |
| Line 2249 pool_allocator_alloc(struct pool *org, i |
|
| Line 2254 pool_allocator_alloc(struct pool *org, i |
|
| } |
} |
| |
|
| /* |
/* |
| * Drain all pools, except "org", that use this |
* Drain all pools, that use this allocator. |
| * allocator. We do this to reclaim VA space. |
* We do this to reclaim VA space. |
| * pa_alloc is responsible for waiting for |
* pa_alloc is responsible for waiting for |
| * physical memory. |
* physical memory. |
| * |
* |
| Line 2271 pool_allocator_alloc(struct pool *org, i |
|
| Line 2276 pool_allocator_alloc(struct pool *org, i |
|
| do { |
do { |
| TAILQ_REMOVE(&pa->pa_list, pp, pr_alloc_list); |
TAILQ_REMOVE(&pa->pa_list, pp, pr_alloc_list); |
| TAILQ_INSERT_TAIL(&pa->pa_list, pp, pr_alloc_list); |
TAILQ_INSERT_TAIL(&pa->pa_list, pp, pr_alloc_list); |
| if (pp == org) |
|
| continue; |
|
| simple_unlock(&pa->pa_slock); |
simple_unlock(&pa->pa_slock); |
| freed = pool_reclaim(pp); |
freed = pool_reclaim(pp); |
| simple_lock(&pa->pa_slock); |
simple_lock(&pa->pa_slock); |