| version 1.30.2.5, 2001/01/18 09:23:45 |
version 1.30.2.6, 2001/02/11 19:16:48 |
| Line 145 struct pool_cache_group { |
|
| Line 145 struct pool_cache_group { |
|
| static void pool_cache_reclaim(struct pool_cache *); |
static void pool_cache_reclaim(struct pool_cache *); |
| |
|
| static int pool_catchup(struct pool *); |
static int pool_catchup(struct pool *); |
| static void pool_prime_page(struct pool *, caddr_t); |
static int pool_prime_page(struct pool *, caddr_t, int); |
| static void *pool_page_alloc(unsigned long, int, int); |
static void *pool_page_alloc(unsigned long, int, int); |
| static void pool_page_free(void *, unsigned long, int); |
static void pool_page_free(void *, unsigned long, int); |
| |
|
| Line 714 _pool_get(struct pool *pp, int flags, co |
|
| Line 714 _pool_get(struct pool *pp, int flags, co |
|
| } |
} |
| |
|
| /* We have more memory; add it to the pool */ |
/* We have more memory; add it to the pool */ |
| |
if (pool_prime_page(pp, v, flags & PR_WAITOK) != 0) { |
| |
/* |
| |
* Probably, we don't allowed to wait and |
| |
* couldn't allocate a page header. |
| |
*/ |
| |
(*pp->pr_free)(v, pp->pr_pagesz, pp->pr_mtype); |
| |
pp->pr_nfail++; |
| |
pr_leave(pp); |
| |
simple_unlock(&pp->pr_slock); |
| |
return (NULL); |
| |
} |
| pp->pr_npagealloc++; |
pp->pr_npagealloc++; |
| pool_prime_page(pp, v); |
|
| |
|
| /* Start the allocation process over. */ |
/* Start the allocation process over. */ |
| goto startover; |
goto startover; |
|
|
| pool_prime(struct pool *pp, int n, caddr_t storage) |
pool_prime(struct pool *pp, int n, caddr_t storage) |
| { |
{ |
| caddr_t cp; |
caddr_t cp; |
| int newnitems, newpages; |
int error, newnitems, newpages; |
| |
|
| #ifdef DIAGNOSTIC |
#ifdef DIAGNOSTIC |
| if (__predict_false(storage && !(pp->pr_roflags & PR_STATIC))) |
if (__predict_false(storage && !(pp->pr_roflags & PR_STATIC))) |
| Line 992 pool_prime(struct pool *pp, int n, caddr |
|
| Line 1002 pool_prime(struct pool *pp, int n, caddr |
|
| return (ENOMEM); |
return (ENOMEM); |
| } |
} |
| |
|
| |
if ((error = pool_prime_page(pp, cp, PR_NOWAIT)) != 0) { |
| |
if ((pp->pr_roflags & PR_STATIC) == 0) |
| |
(*pp->pr_free)(cp, pp->pr_pagesz, |
| |
pp->pr_mtype); |
| |
simple_unlock(&pp->pr_slock); |
| |
return (error); |
| |
} |
| pp->pr_npagealloc++; |
pp->pr_npagealloc++; |
| pool_prime_page(pp, cp); |
|
| pp->pr_minpages++; |
pp->pr_minpages++; |
| } |
} |
| |
|
| Line 1011 pool_prime(struct pool *pp, int n, caddr |
|
| Line 1027 pool_prime(struct pool *pp, int n, caddr |
|
| * |
* |
| * Note, we must be called with the pool descriptor LOCKED. |
* Note, we must be called with the pool descriptor LOCKED. |
| */ |
*/ |
| static void |
static int |
| pool_prime_page(struct pool *pp, caddr_t storage) |
pool_prime_page(struct pool *pp, caddr_t storage, int flags) |
| { |
{ |
| struct pool_item *pi; |
struct pool_item *pi; |
| struct pool_item_header *ph; |
struct pool_item_header *ph; |
| Line 1028 pool_prime_page(struct pool *pp, caddr_t |
|
| Line 1044 pool_prime_page(struct pool *pp, caddr_t |
|
| ph = (struct pool_item_header *)(cp + pp->pr_phoffset); |
ph = (struct pool_item_header *)(cp + pp->pr_phoffset); |
| } else { |
} else { |
| s = splhigh(); |
s = splhigh(); |
| ph = pool_get(&phpool, PR_URGENT); |
ph = pool_get(&phpool, flags); |
| splx(s); |
splx(s); |
| |
if (ph == NULL) |
| |
return (ENOMEM); |
| LIST_INSERT_HEAD(&pp->pr_hashtab[PR_HASH_INDEX(pp, cp)], |
LIST_INSERT_HEAD(&pp->pr_hashtab[PR_HASH_INDEX(pp, cp)], |
| ph, ph_hashlist); |
ph, ph_hashlist); |
| } |
} |
| Line 1083 pool_prime_page(struct pool *pp, caddr_t |
|
| Line 1101 pool_prime_page(struct pool *pp, caddr_t |
|
| |
|
| if (++pp->pr_npages > pp->pr_hiwat) |
if (++pp->pr_npages > pp->pr_hiwat) |
| pp->pr_hiwat = pp->pr_npages; |
pp->pr_hiwat = pp->pr_npages; |
| |
|
| |
return (0); |
| } |
} |
| |
|
| /* |
/* |
| Line 1129 pool_catchup(struct pool *pp) |
|
| Line 1149 pool_catchup(struct pool *pp) |
|
| error = ENOMEM; |
error = ENOMEM; |
| break; |
break; |
| } |
} |
| |
if ((error = pool_prime_page(pp, cp, PR_NOWAIT)) != 0) { |
| |
(*pp->pr_free)(cp, pp->pr_pagesz, pp->pr_mtype); |
| |
break; |
| |
} |
| pp->pr_npagealloc++; |
pp->pr_npagealloc++; |
| pool_prime_page(pp, cp); |
|
| } |
} |
| |
|
| return (error); |
return (error); |