summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2005-04-03 11:49:02 +0000
committerjeff <jeff@FreeBSD.org>2005-04-03 11:49:02 +0000
commit62c728e49968c042f9b8b2deab7f27f93fb24b6b (patch)
treeb47dd27f8ab8e1334103426dc066b622e5a630f8 /sys/kern
parente2abc701a549728aa912e77753c2cf0e10ca9a1a (diff)
downloadFreeBSD-src-62c728e49968c042f9b8b2deab7f27f93fb24b6b.zip
FreeBSD-src-62c728e49968c042f9b8b2deab7f27f93fb24b6b.tar.gz
- Slightly restructure acquire() so I can add more ktr information and
an assert to help find two strange bugs. - Remove some nearby spls.
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/kern_lock.c32
1 files changed, 14 insertions, 18 deletions
diff --git a/sys/kern/kern_lock.c b/sys/kern/kern_lock.c
index 6762c1b..019a26b 100644
--- a/sys/kern/kern_lock.c
+++ b/sys/kern/kern_lock.c
@@ -116,35 +116,31 @@ static int
acquire(struct lock **lkpp, int extflags, int wanted)
{
struct lock *lkp = *lkpp;
- int s, error;
+ int error;
CTR3(KTR_LOCK,
"acquire(): lkp == %p, extflags == 0x%x, wanted == 0x%x",
lkp, extflags, wanted);
- if ((extflags & LK_NOWAIT) && (lkp->lk_flags & wanted)) {
+ if ((extflags & LK_NOWAIT) && (lkp->lk_flags & wanted))
return EBUSY;
- }
-
- s = splhigh();
+ error = 0;
while ((lkp->lk_flags & wanted) != 0) {
+ CTR2(KTR_LOCK,
+ "acquire(): lkp == %p, lk_flags == 0x%x sleeping",
+ lkp, lkp->lk_flags);
lkp->lk_flags |= LK_WAIT_NONZERO;
lkp->lk_waitcount++;
error = msleep(lkp, lkp->lk_interlock, lkp->lk_prio,
lkp->lk_wmesg,
((extflags & LK_TIMELOCK) ? lkp->lk_timo : 0));
- if (lkp->lk_waitcount == 1) {
+ lkp->lk_waitcount--;
+ if (lkp->lk_waitcount == 0)
lkp->lk_flags &= ~LK_WAIT_NONZERO;
- lkp->lk_waitcount = 0;
- } else {
- lkp->lk_waitcount--;
- }
- if (error) {
- splx(s);
- return error;
- }
+ if (error)
+ break;
if (extflags & LK_SLEEPFAIL) {
- splx(s);
- return ENOLCK;
+ error = ENOLCK;
+ break;
}
if (lkp->lk_newlock != NULL) {
mtx_lock(lkp->lk_newlock->lk_interlock);
@@ -154,8 +150,8 @@ acquire(struct lock **lkpp, int extflags, int wanted)
*lkpp = lkp = lkp->lk_newlock;
}
}
- splx(s);
- return 0;
+ mtx_assert(lkp->lk_interlock, MA_OWNED);
+ return (error);
}
/*
OpenPOWER on IntegriCloud