1
0
mirror of https://git.FreeBSD.org/src.git synced 2025-01-06 13:09:50 +00:00

Use msleep() to avoid lost wakeup's instead of doing an ineffective

splhigh() before the mtx_unlock and tsleep().  The splhigh() was probably
correct in the original code using simplelocks but is not correct in
5.0-current.

Noticed by:	Andrew Reiter <awr@FreeBSD.org>
This commit is contained in:
John Baldwin 2001-10-26 06:09:01 +00:00
parent e74ea2d01a
commit 40c6d2be16
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=85519

View File

@ -426,35 +426,25 @@ rman_activate_resource(struct resource *r)
int
rman_await_resource(struct resource *r, int pri, int timo)
{
int rv, s;
int rv;
struct resource *whohas;
struct rman *rm;
rm = r->r_rm;
mtx_lock(rm->rm_mtx);
for (;;) {
mtx_lock(rm->rm_mtx);
rv = int_rman_activate_resource(rm, r, &whohas);
if (rv != EBUSY)
return (rv); /* returns with mutex held */
if (r->r_sharehead == 0)
panic("rman_await_resource");
/*
* splhigh hopefully will prevent a race between
* mtx_unlock and tsleep where a process
* could conceivably get in and release the resource
* before we have a chance to sleep on it.
*/
s = splhigh();
whohas->r_flags |= RF_WANTED;
mtx_unlock(rm->rm_mtx);
rv = tsleep(r->r_sharehead, pri, "rmwait", timo);
rv = msleep(r->r_sharehead, rm->rm_mtx, pri, "rmwait", timo);
if (rv) {
splx(s);
return rv;
mtx_unlock(rm->rm_mtx);
return (rv);
}
mtx_lock(rm->rm_mtx);
splx(s);
}
}