summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2001-10-26 06:09:01 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2001-10-26 06:09:01 +0000
commit40c6d2be1671ecca889e633a397c3a499e841c36 (patch)
tree040d2032f8f4bf1ba3f704fc7a04dc4ed5919a64
parente74ea2d01afb1cae6380dc28912cea2889e05451 (diff)
Notes
-rw-r--r--sys/kern/subr_rman.c20
1 files changed, 5 insertions, 15 deletions
diff --git a/sys/kern/subr_rman.c b/sys/kern/subr_rman.c
index 1fbafd3aeaec..67791c26f328 100644
--- a/sys/kern/subr_rman.c
+++ b/sys/kern/subr_rman.c
@@ -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);
}
}