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, *drp; uma_slab_t slab; int aflags, domain; bool rr; @@ -3660,14 +3661,16 @@ * 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); + drp = &keg->uk_dr; + vm_domainset_iter_policy_ref_init(&di, drp, &domain, &aflags); } else { - aflags = flags; - domain = rdomain; + dr.dr_policy = DOMAINSET_PREF(rdomain); + dr.dr_iter = rdomain; + drp = &dr; + vm_domainset_iter_policy_ref_init(&di, drp, &domain, &aflags); } for (;;) { @@ -3686,9 +3689,9 @@ return (slab); if (!rr && (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); + vm_wait_doms(drp->dr_policy->ds_mask, 0); goto restart; } break; @@ -3700,7 +3703,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);