commit 904323885a4ef72dcf0fe743cf086a2e9e9a09d8 Author: Mateusz Guzik Date: Thu Aug 6 17:52:23 2020 -0400 meh fixup diff --git a/sys/kern/kern_obm.c b/sys/kern/kern_obm.c index d999ed0e5fd6..9f98971d1128 100644 --- a/sys/kern/kern_obm.c +++ b/sys/kern/kern_obm.c @@ -69,41 +69,41 @@ obm_init(obm_lock_t *obm) } void -obm_lock_slow(obm_lock_t *obm, struct lock_object *lo) +obm_lock_slow(obm_lock_t *obm, struct lock_object *lo, uint8_t v) { struct turnstile *ts; struct lock_delay_arg lda; - uint8_t v; #ifdef OBM_DEBUG atomic_add_long(&obm_slow_lock, 1); #endif lock_delay_arg_init(&lda, &locks_delay); - lock_delay(&lda); for (;;) { - v = atomic_load_8(&obm->lk); if (v == OBM_UNLOCKED) { if (atomic_fcmpset_acq_char(&obm->lk, &v, OBM_LOCKED) != 0) break; + continue; + } + + if ((v & OBM_CONTESTED) == 0) { lock_delay(&lda); + v = atomic_load_8(&obm->lk); continue; } ts = turnstile_trywait(lo); v = atomic_load_8(&obm->lk); +retry_ts: if (v == OBM_UNLOCKED) { turnstile_cancel(ts); - if (atomic_fcmpset_acq_8(&obm->lk, &v, OBM_LOCKED) != 0) - break; - lock_delay(&lda); continue; } if ((v & OBM_CONTESTED) == 0 && atomic_fcmpset_8(&obm->lk, &v, v | OBM_CONTESTED) == 0) { - turnstile_cancel(ts); - continue; + goto retry_ts; } turnstile_wait(ts, NULL, TS_SHARED_QUEUE); + v = atomic_load_8(&obm->lk); } TD_LOCKS_INC(curthread); } diff --git a/sys/sys/obm.h b/sys/sys/obm.h index d14039358ec2..2ccfe34945d3 100644 --- a/sys/sys/obm.h +++ b/sys/sys/obm.h @@ -46,7 +46,7 @@ void obm_init_lo(struct lock_object *lo, const char *name); void obm_init(obm_lock_t *obm); -void obm_lock_slow(obm_lock_t *obm, struct lock_object *lo); +void obm_lock_slow(obm_lock_t *obm, struct lock_object *lo, uint8_t v); void obm_unlock_slow(obm_lock_t *obm, struct lock_object *lo); __used static void @@ -81,7 +81,7 @@ obm_lock(obm_lock_t *obm, struct lock_object *lo) } else { MPASS(v == OBM_LOCKED || v == (OBM_LOCKED | OBM_CONTESTED) || v == OBM_UNLOCKED); - obm_lock_slow(obm, lo); + obm_lock_slow(obm, lo, v); } }