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:
parent
27f56d337b
commit
fd6ca665d2
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user