summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-04-26 15:02:00 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-10-20 14:59:54 +0200
commitb9880143628ad4d1b2c7423d28d852988f7a469e (patch)
treeb9e377aea8227dd2e1ad0b2065e41b0356f40908
parentDEVICE(9): Avoid NULL pointer access (diff)
downloadrtems-libbsd-b9880143628ad4d1b2c7423d28d852988f7a469e.tar.bz2
ZONE(9): Fix uma_zone_set_max()
Account for items provided for per-processor caches.
-rw-r--r--freebsd/sys/vm/uma_core.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/freebsd/sys/vm/uma_core.c b/freebsd/sys/vm/uma_core.c
index f8c8476c..840c8766 100644
--- a/freebsd/sys/vm/uma_core.c
+++ b/freebsd/sys/vm/uma_core.c
@@ -3016,6 +3016,15 @@ uma_zone_set_max(uma_zone_t zone, int nitems)
if (keg == NULL)
return (0);
KEG_LOCK(keg);
+#ifdef __rtems__
+#ifdef SMP
+ /*
+ * Ensure we have enough items to fill the per-processor caches. This
+ * is a heuristic approach and works not under all conditions.
+ */
+ nitems += 2 * BUCKET_MAX * (mp_maxid + 1);
+#endif
+#endif /* __rtems__ */
keg->uk_maxpages = (nitems / keg->uk_ipers) * keg->uk_ppera;
if (keg->uk_maxpages * keg->uk_ipers < nitems)
keg->uk_maxpages += keg->uk_ppera;