Add uma_zone_set_max() to add enforced limits to non vm obj backed zones.

This commit is contained in:
Jeff Roberson 2002-03-20 05:28:34 +00:00
parent 21d7ec8915
commit 736ee5907f
2 changed files with 25 additions and 10 deletions

View File

@ -359,6 +359,16 @@ void uma_reclaim(void);
struct vm_object;
int uma_zone_set_obj(uma_zone_t zone, struct vm_object *obj, int size);
/*
* Sets a high limit on the number of items allowed in a zone
*
* Arguments:
* zone The zone to limit
*
* Returns:
* Nothing
*/
void uma_zone_set_max(uma_zone_t zone, int nitems);
/*
* Replaces the standard page_alloc or obj_alloc functions for this zone

View File

@ -599,6 +599,9 @@ slab_zalloc(uma_zone_t zone, int wait)
#ifdef UMA_DEBUG
printf("slab_zalloc: Allocating a new slab for %s\n", zone->uz_name);
#endif
if (zone->uz_maxpages &&
zone->uz_pages + zone->uz_ppera > zone->uz_maxpages)
return (NULL);
if (booted || (zone->uz_flags & UMA_ZFLAG_PRIVALLOC)) {
ZONE_UNLOCK(zone);
@ -734,10 +737,6 @@ obj_alloc(uma_zone_t zone, int bytes, u_int8_t *flags, int wait)
vm_page_t p;
int pages;
if (zone->uz_pages + zone->uz_ppera > zone->uz_maxpages)
return (NULL);
retkva = NULL;
pages = zone->uz_pages;
@ -1242,12 +1241,6 @@ zalloc_start:
* If isitem is set then we should just return it. The cpu lock
* was unlocked when we couldn't get a bucket.
*/
#ifdef INVARIANTS
if (wait == M_WAITOK)
KASSERT(item != NULL,
("uma_zalloc: WAITOK set but we're returning NULL"));
#endif
return item;
}
@ -1676,6 +1669,18 @@ uma_zfree_internal(uma_zone_t zone, void *item, void *udata, int skip)
zone->uz_dtor(item, zone->uz_size, udata);
}
/* See uma.h */
void
uma_zone_set_max(uma_zone_t zone, int nitems)
{
ZONE_LOCK(zone);
if (zone->uz_ppera > 1)
zone->uz_maxpages = nitems / zone->uz_ppera;
else
zone->uz_maxpages = nitems / zone->uz_ipers;
ZONE_UNLOCK(zone);
}
/* See uma.h */
void
uma_zone_set_freef(uma_zone_t zone, uma_free freef)