diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c --- a/sys/kern/kern_umtx.c +++ b/sys/kern/kern_umtx.c @@ -2616,6 +2616,10 @@ } } else if (owner == UMUTEX_RB_NOTRECOV) { error = ENOTRECOVERABLE; + } else if (owner == UMUTEX_CONTESTED) { + /* Spurious failure, retry. */ + umtxq_unbusy_unlocked(&uq->uq_key); + continue; } if (try != 0) @@ -2834,6 +2838,14 @@ if (error != 0) break; + /* + * We may have gotten a spurious failure. + */ + if (owner == UMUTEX_CONTESTED) { + umtxq_unbusy_unlocked(&uq->uq_key); + continue; + } + /* * We set the contested bit, sleep. Otherwise the lock changed * and we need to retry or we lost a race to the thread