Date: Mon, 12 Jun 2006 08:08:43 +0100 (BST) From: Robert Watson <rwatson@FreeBSD.org> To: Poul-Henning Kamp <phk@phk.freebsd.dk> Cc: current@FreeBSD.org, Kris Kennaway <kris@obsecurity.org> Subject: Re: FILEDESC_LOCK() implementation Message-ID: <20060612080504.W26634@fledge.watson.org> In-Reply-To: <34009.1150095661@critter.freebsd.dk> References: <34009.1150095661@critter.freebsd.dk>
next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, 12 Jun 2006, Poul-Henning Kamp wrote:
> In message <20060612075515.C26634@fledge.watson.org>, Robert Watson writes:
>
>> What we probably want is an sx_init_interlock() that allows us to provide
>> the interlock for an sx lock, wich some variations on sx_*lock() to say we
>> already hold the interlock.
>
> Sounds overly complicated to use.
>
> Why not just a sx_xlockfast() sx_xunlockfast() ? for some value of "fast" ?
At least in the VFS and socket code, you want a notion of acquiring both and
dropping one, or upgrading/downgrading. The logic tends to go something like
this:
SOCKBUF_LOCK(&sb->sb_rcv);
/* blah blah blah */
sb_lock(&sb->sb_rcv); /* requires interlock */
/* blah blah blah */
label:
/* blah blah blah */
sb_wait(&sb->sb_rcv); /* drop interlock in msleep but keep sleep lock */
/* blah blah blah */
SOCKBUF_UNLOCK(&sb->sb_rcv);
so->proto->pru_rcvd(foo); /* drop interlock for layer boundary */
SOCKBUF_LOCK(&sb->sb_rcv);
if (!done)
goto label;
sb_unlock(&sb->sb_rcv);
SOCKBUF_UNLOCK(&sb->sb_rcv);
I.e., you use the mutex for specific regions, dropping it for layer boundaries
and sleeping, but hold the sleep lock for longer periods.
Robert N M Watson
Computer Laboratory
Universty of Cambridge
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060612080504.W26634>
