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:
parent
e74ea2d01a
commit
40c6d2be16
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=85519
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user