summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2014-06-22 21:18:24 +0000
committermav <mav@FreeBSD.org>2014-06-22 21:18:24 +0000
commitd2e570bf14cdc6de0348d6a29f0036bbce1f0a57 (patch)
tree1b0d15b8d31cf939b02bbf0960ac5c97d19f31d4 /sys/vm
parent48559e83fe4df046cb41c32db61d773aae911fd8 (diff)
downloadFreeBSD-src-d2e570bf14cdc6de0348d6a29f0036bbce1f0a57.zip
FreeBSD-src-d2e570bf14cdc6de0348d6a29f0036bbce1f0a57.tar.gz
MFC r267387:
Allocating new bucket for bucket zone, never take it from the zone itself, since it will almost certanly fail. Take next bigger zone instead. This situation should not happen with original bucket zones configuration: "32 Bucket" zone uses "64 Bucket" and vice versa. But if "64 Bucket" zone lock is congested, zone may grow its bucket size and start biting itself.
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/uma_core.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c
index 3350356..8ff5826 100644
--- a/sys/vm/uma_core.c
+++ b/sys/vm/uma_core.c
@@ -381,6 +381,8 @@ bucket_alloc(uma_zone_t zone, void *udata, int flags)
if ((uintptr_t)udata & UMA_ZFLAG_CACHEONLY)
flags |= M_NOVM;
ubz = bucket_zone_lookup(zone->uz_count);
+ if (ubz->ubz_zone == zone && (ubz + 1)->ubz_entries != 0)
+ ubz++;
bucket = uma_zalloc_arg(ubz->ubz_zone, udata, flags);
if (bucket) {
#ifdef INVARIANTS
OpenPOWER on IntegriCloud