diff options
| author | Jeff Roberson <jeff@FreeBSD.org> | 2002-03-20 05:28:34 +0000 |
|---|---|---|
| committer | Jeff Roberson <jeff@FreeBSD.org> | 2002-03-20 05:28:34 +0000 |
| commit | 736ee5907f3de3559a85fbb0c12b75d10d4f4c90 (patch) | |
| tree | 2bde23573b4710d2ce6cbe8b09b39802f83ecc04 /sys/vm | |
| parent | 21d7ec8915a4a1f75e2b613a81144eaa0bd69abd (diff) | |
Notes
Diffstat (limited to 'sys/vm')
| -rw-r--r-- | sys/vm/uma.h | 10 | ||||
| -rw-r--r-- | sys/vm/uma_core.c | 25 |
2 files changed, 25 insertions, 10 deletions
diff --git a/sys/vm/uma.h b/sys/vm/uma.h index be2c90b92ab0..0797519ab34d 100644 --- a/sys/vm/uma.h +++ b/sys/vm/uma.h @@ -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 diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c index 5b4be4b8905f..2f1b7655ca29 100644 --- a/sys/vm/uma_core.c +++ b/sys/vm/uma_core.c @@ -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; } @@ -1678,6 +1671,18 @@ uma_zfree_internal(uma_zone_t zone, void *item, void *udata, int skip) /* 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) { ZONE_LOCK(zone); |
