Index: sys/vm/uma_core.c =================================================================== --- sys/vm/uma_core.c +++ sys/vm/uma_core.c @@ -3647,6 +3647,7 @@ keg_fetch_slab(uma_keg_t keg, uma_zone_t zone, int rdomain, const int flags) { struct vm_domainset_iter di; + struct domainset_ref dr; uma_slab_t slab; int aflags, domain; bool rr; @@ -3660,14 +3661,15 @@ * means that we cannot allow the vm_domainset layer to sleep. Thus, * clear M_WAITOK and handle low memory conditions locally. */ + aflags = (flags & ~M_WAITOK) | M_NOWAIT; rr = rdomain == UMA_ANYDOMAIN; if (rr) { - aflags = (flags & ~M_WAITOK) | M_NOWAIT; vm_domainset_iter_policy_ref_init(&di, &keg->uk_dr, &domain, &aflags); } else { - aflags = flags; - domain = rdomain; + dr.dr_policy = DOMAINSET_PREF(rdomain); + dr.dr_iter = rdomain; + vm_domainset_iter_policy_ref_init(&di, &dr, &domain, &aflags); } for (;;) { @@ -3684,9 +3686,9 @@ slab = keg_alloc_slab(keg, zone, domain, flags, aflags); if (slab != NULL) return (slab); - if (!rr && (flags & M_WAITOK) == 0) + if ((flags & M_WAITOK) == 0) break; - if (rr && vm_domainset_iter_policy(&di, &domain) != 0) { + if (vm_domainset_iter_policy(&di, &domain) != 0) { if ((flags & M_WAITOK) != 0) { vm_wait_doms(&keg->uk_dr.dr_policy->ds_mask, 0); goto restart; @@ -3700,7 +3702,7 @@ * could have while we were unlocked. Check again before we * fail. */ - if ((slab = keg_fetch_free_slab(keg, domain, rr, flags)) != NULL) + if ((slab = keg_fetch_free_slab(keg, rdomain, true, flags)) != NULL) return (slab); return (NULL);