From 20d3ab87cd7cb42f44cae9a755d03e87e966c48a Mon Sep 17 00:00:00 2001 From: Alexander Motin Date: Thu, 12 Jun 2014 11:36:22 +0000 Subject: [PATCH] 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. MFC after: 2 weeks Sponsored by: iXsystems, Inc. --- sys/vm/uma_core.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c index 335035693b9..8ff5826de0a 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