Page MenuHomeFreeBSD

D25952.id75400.diff
No OneTemporary

D25952.id75400.diff

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
@@ -682,8 +682,11 @@
return (NULL);
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;
+ if (STAILQ_NEXT(bucket, ub_link) != NULL) {
+ /* This might invalidate uzd_seq, but that's ok. */
+ atomic_store_32(&zdom->uzd_seq,
+ STAILQ_NEXT(bucket, ub_link)->ub_seq);
+ }
}
MPASS(zdom->uzd_nitems >= bucket->ub_cnt);
STAILQ_REMOVE_HEAD(&zdom->uzd_buckets, ub_link);
@@ -732,7 +735,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 +893,7 @@
{
uma_zone_domain_t zdom;
uma_bucket_t bucket;
+ smr_seq_t seq;
/*
* Avoid the lock if possible.
@@ -898,9 +902,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 +2577,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

File Metadata

Mime Type
text/plain
Expires
Fri, Aug 21, 9:10 PM (14 h, 21 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
37038104
Default Alt Text
D25952.id75400.diff (2 KB)

Event Timeline