Date: Fri, 2 May 1997 07:24:54 -0400 (EDT) From: Peter Dufault <dufault@hda.com> To: phk@dk.tfs.com (Poul-Henning Kamp) Cc: current@freebsd.org Subject: Re: vnode->v_usage Message-ID: <199705021124.HAA27754@hda.hda.com> In-Reply-To: <5321.862569821@critter> from Poul-Henning Kamp at "May 2, 97 12:43:41 pm"
next in thread | previous in thread | raw e-mail | index | archive | help
> Ok, now I'm in doubt here... Which of these two places are the
> correct place to release the interlock, I've marked the candidates
> with XXX, I pressume the later, right ?
>
> void
> vtouch(vp)
> struct vnode *vp;
> {
> simple_lock(&vp->v_interlock);
> if (vp->v_usecount) {
> simple_unlock(&vp->v_interlock);
> return;
> }
> simple_unlock(&vp->v_interlock); /* XXX */
> simple_lock(&vnode_free_list_slock);
> TAILQ_REMOVE(&vnode_free_list, vp, v_freelist);
> TAILQ_INSERT_TAIL(&vnode_free_list, vp, v_freelist);
> simple_unlock(&vnode_free_list_slock);
> simple_unlock(&vp->v_interlock); /* XXX */
> }
>
The first unlock won't work since a second thread can come in and
decide to do the same move. Obviously you have a lock ordering issue
with the nested lock and you have to define the ordering.
Moving items between two lists should be atomic - it is common
and lends itself to clean implementation.
Aside: how about making the queues truly opaque while you're doing this?
Then you have a single place to enable locking hierarchy violation detection,
*CAS types of implementations, etc.
Peter
--
Peter Dufault (dufault@hda.com) Realtime Machine Control and Simulation
HD Associates, Inc. Voice: 508 433 6936
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199705021124.HAA27754>
