Index: sys/kern/subr_smr.c =================================================================== --- sys/kern/subr_smr.c +++ sys/kern/subr_smr.c @@ -487,6 +487,8 @@ /* * It is illegal to enter while in an smr section. */ + KASSERT(goal != SMR_SEQ_INVALID, + ("smr_poll: Invalid sequence number.")); KASSERT(!wait || !SMR_ENTERED(smr), ("smr_poll: Blocking not allowed in a SMR section.")); KASSERT(!wait || (zpcpu_get(smr)->c_flags & SMR_LAZY) == 0, Index: sys/vm/uma_core.c =================================================================== --- sys/vm/uma_core.c +++ sys/vm/uma_core.c @@ -668,6 +668,7 @@ { uma_bucket_t bucket; int i; + smr_seq_t seq; bool dtor = false; ZDOM_LOCK_ASSERT(zdom); @@ -683,7 +684,10 @@ bucket->ub_seq = SMR_SEQ_INVALID; dtor = (zone->uz_dtor != NULL) || UMA_ALWAYS_CTORDTOR; if (STAILQ_NEXT(bucket, ub_link) != NULL) - zdom->uzd_seq = STAILQ_NEXT(bucket, ub_link)->ub_seq; + seq = STAILQ_NEXT(bucket, ub_link)->ub_seq; + else + seq = SMR_SEQ_INVALID; + atomic_store_32(&zdom->uzd_seq, seq); } MPASS(zdom->uzd_nitems >= bucket->ub_cnt); STAILQ_REMOVE_HEAD(&zdom->uzd_buckets, ub_link); @@ -732,7 +736,7 @@ if (ws) zone_domain_imax_set(zdom, zdom->uzd_nitems); if (STAILQ_EMPTY(&zdom->uzd_buckets)) - zdom->uzd_seq = bucket->ub_seq; + atomic_store_32(&zdom->uzd_seq, bucket->ub_seq); STAILQ_INSERT_TAIL(&zdom->uzd_buckets, bucket, ub_link); ZDOM_UNLOCK(zdom); return; @@ -890,6 +894,7 @@ { uma_zone_domain_t zdom; uma_bucket_t bucket; + smr_seq_t seq; /* * Avoid the lock if possible. @@ -898,9 +903,12 @@ if (zdom->uzd_nitems == 0) return (NULL); - if ((cache_uz_flags(cache) & UMA_ZONE_SMR) != 0 && - !smr_poll(zone->uz_smr, zdom->uzd_seq, false)) - return (NULL); + if ((cache_uz_flags(cache) & UMA_ZONE_SMR) != 0) { + seq = atomic_load_32(&zdom->uzd_seq); + if (seq != SMR_SEQ_INVALID && + !smr_poll(zone->uz_smr, seq, false)) + return (NULL); + } /* * Check the zone's cache of buckets. @@ -2570,6 +2578,7 @@ zdom = ZDOM_GET(zone, i); ZDOM_LOCK_INIT(zone, zdom, (arg->flags & UMA_ZONE_MTXCLASS)); STAILQ_INIT(&zdom->uzd_buckets); + zdom->uzd_seq = SMR_SEQ_INVALID; } #ifdef INVARIANTS