From aa0e8b9e515b3df6d81ffe9b1e252449fe6efb7b Mon Sep 17 00:00:00 2001 From: jeff Date: Wed, 20 Mar 2002 05:28:34 +0000 Subject: [PATCH] Add uma_zone_set_max() to add enforced limits to non vm obj backed zones. --- sys/vm/uma.h | 10 ++++++++++ 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; } @@ -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)