summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandre <andre@FreeBSD.org>2010-08-16 14:24:00 +0000
committerandre <andre@FreeBSD.org>2010-08-16 14:24:00 +0000
commitc239a236c133a4ec85da52df6f459b176073ffb5 (patch)
tree53cc3f15371d15c1aca61a769565d66f1f460c83
parent04035a1299f7dc7d5895bd3a50c9bd918e2eedb1 (diff)
downloadFreeBSD-src-c239a236c133a4ec85da52df6f459b176073ffb5.zip
FreeBSD-src-c239a236c133a4ec85da52df6f459b176073ffb5.tar.gz
Add uma_zone_get_max() to obtain the effective limit after a call
to uma_zone_set_max(). The UMA zone limit is not exactly set to the value supplied but rounded up to completely fill the backing store increment (a page normally). This can lead to surprising situations where the number of elements allocated from UMA is higher than the supplied limit value. The new get function reads back the effective value so that the supplied limit value can be adjusted to the real limit. Reviewed by: jeffr MFC after: 1 week
-rw-r--r--sys/vm/uma.h12
-rw-r--r--sys/vm/uma_core.c18
2 files changed, 30 insertions, 0 deletions
diff --git a/sys/vm/uma.h b/sys/vm/uma.h
index 2076d3b..f0522b0 100644
--- a/sys/vm/uma.h
+++ b/sys/vm/uma.h
@@ -459,6 +459,18 @@ int uma_zone_set_obj(uma_zone_t zone, struct vm_object *obj, int size);
void uma_zone_set_max(uma_zone_t zone, int nitems);
/*
+ * Obtains the effective limit on the number of items in a zone
+ *
+ * Arguments:
+ * zone The zone to obtain the effective limit from
+ *
+ * Return:
+ * 0 No limit
+ * int The effective limit of the zone
+ */
+int uma_zone_get_max(uma_zone_t zone);
+
+/*
* The following two routines (uma_zone_set_init/fini)
* are used to set the backend init/fini pair which acts on an
* object as it becomes allocated and is placed in a slab within
diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c
index 2dcd14f..558b4c7 100644
--- a/sys/vm/uma_core.c
+++ b/sys/vm/uma_core.c
@@ -2797,6 +2797,24 @@ uma_zone_set_max(uma_zone_t zone, int nitems)
}
/* See uma.h */
+int
+uma_zone_get_max(uma_zone_t zone)
+{
+ int nitems;
+ uma_keg_t keg;
+
+ ZONE_LOCK(zone);
+ keg = zone_first_keg(zone);
+ if (keg->uk_maxpages)
+ nitems = keg->uk_maxpages * keg->uk_ipers;
+ else
+ nitems = 0;
+ ZONE_UNLOCK(zone);
+
+ return (nitems);
+}
+
+/* See uma.h */
void
uma_zone_set_init(uma_zone_t zone, uma_init uminit)
{
OpenPOWER on IntegriCloud