Fix umtxq_sleep() regression caused by 56070dd2e4.

umtxq_requeue() moves the queue to a different hash chain and different
lock, so we can't rely on msleep_sbt() reacquiring the same old lock.
We have to use PDROP and update the queue chain and so lock pointer.

PR:		262587
MFC after:	2 weeks
This commit is contained in:
Alexander Motin 2022-03-21 19:43:39 -04:00
parent 27f56d337b
commit fd6ca665d2

View File

@ -808,8 +808,10 @@ umtxq_sleep(struct umtx_q *uq, const char *wmesg,
if (error != 0) if (error != 0)
break; break;
} }
error = msleep_sbt(uq, &uc->uc_lock, PCATCH, wmesg, error = msleep_sbt(uq, &uc->uc_lock, PCATCH | PDROP, wmesg,
sbt, 0, flags); sbt, 0, flags);
uc = umtxq_getchain(&uq->uq_key);
mtx_lock(&uc->uc_lock);
if (error == EINTR || error == ERESTART) if (error == EINTR || error == ERESTART)
break; break;
if (error == EWOULDBLOCK && (flags & C_ABSOLUTE) != 0) { if (error == EWOULDBLOCK && (flags & C_ABSOLUTE) != 0) {