Subject: Re: Redoing file system suspension API (update)
To: Juergen Hannken-Illjes <hannken@eis.cs.tu-bs.de>
From: Jason Thorpe <thorpej@shagadelic.org>
List: tech-kern
Date: 06/29/2006 11:04:08
On Jun 29, 2006, at 9:54 AM, Juergen Hannken-Illjes wrote:
> At least as a base. Lockmgr locks lack the "do I have a shared
> lock" query.
> I need a lock where a thread already owning a shared lock succeeds
> when
> it wants another shared lock. Last time I looked lockmg locks had
> this only
> for exclusive locks.
Um, I'm pretty sure that works already with lockmgr locks (e.g.
recursively acquiring a shared lock you already hold shared). Just
make sure the acquire/releases are paired up and you should be fine.
Let's walk through the logic:
case LK_SHARED:
if (WEHOLDIT(lkp, pid, lid, cpu_num) == 0) {
We fall into this case because the lock is held shared (WEHOLDIT()
returns false).
/*
* If just polling, check to see if we will
block.
*/
if ((extflags & LK_NOWAIT) && (lkp->lk_flags &
(LK_HAVE_EXCL | LK_WANT_EXCL |
LK_WANT_UPGRADE))) {
error = EBUSY;
break;
}
/*
* Wait for exclusive locks and upgrades to
clear.
*/
error = acquire(&lkp, &s, extflags, 0,
LK_HAVE_EXCL | LK_WANT_EXCL |
LK_WANT_UPGRADE);
We wait until no exlusive holders are in / waiting.
if (error)
break;
lkp->lk_sharecount++;
...and we increment the sharecount.
lkp->lk_flags |= LK_SHARE_NONZERO;
COUNT(lkp, l, cpu_num, 1);
break;
}
Looks to me like it should work just fine for what you want to do.
-- thorpej