Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 Apr 2012 21:13:02 +0300
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Martin Simmons <martin@lispworks.com>
Cc:        jack.ren@intel.com, freebsd-threads@freebsd.org
Subject:   Re: About the memory barrier in BSD libc
Message-ID:  <20120424181302.GB2358@deviant.kiev.zoral.com.ua>
In-Reply-To: <201204241800.q3OI0X89007384@higson.cam.lispworks.com>
References:  <20120423084120.GD76983@zxy.spb.ru> <201204241343.q3ODhe2C032683@higson.cam.lispworks.com> <20120424140348.GY2358@deviant.kiev.zoral.com.ua> <201204241110.14017.jhb@freebsd.org> <20120424165842.GZ2358@deviant.kiev.zoral.com.ua> <201204241800.q3OI0X89007384@higson.cam.lispworks.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--6lA9ewhm9nShhcj2
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Tue, Apr 24, 2012 at 07:00:33PM +0100, Martin Simmons wrote:
> >>>>> On Tue, 24 Apr 2012 19:58:42 +0300, Konstantin Belousov said:
> >=20
> > +
> > +	/*
> > +	 * Lock the spinlock used to protect __sglue list walk in
> > +	 * __sfp().  The __sfp() uses fp->_flags =3D=3D 0 test as an
> > +	 * indication of the unused FILE.
> > +	 *
> > +	 * Taking the lock prevents possible compiler or processor
> > +	 * reordering of the writes performed before the final _flags
> > +	 * cleanup, making sure that we are done with the FILE before
> > +	 * it is considered available.
> > +	 */
> > +	STDIO_THREAD_LOCK();
> >  	fp->_flags =3D 0;		/* Release this FILE for reuse. */
> > +	STDIO_THREAD_UNLOCK();
> >  	FUNLOCKFILE(fp);
> >  	return (r);
>=20
> Is that assumption about reordering correct?  I.e. is FreeBSD's spinlock a
> two-way barrier?
>=20
> It isn't unusual for the locking primitive to be a one-way barrier, i.e. =
(from
> Linux kernel memory-barriers.txt) "Memory operations that occur before a =
LOCK
> operation may appear to happen after it completes."  See also acq and rel=
 in
> atomic(9).
Taking the lock prevents the __sfp from iterating the list until the
spinlock is released. Since release makes sure that all previous memory
operations become visible, the acquire in the spinlock lock provides
the neccesary guarentee.

--6lA9ewhm9nShhcj2
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (FreeBSD)

iEYEARECAAYFAk+W7S4ACgkQC3+MBN1Mb4j2XwCfUwYZ5frhFeuNuQblrpS/xCMH
lKAAoMVOuTnHmMBWsL/5YaWIBx+Me3xq
=YN7b
-----END PGP SIGNATURE-----

--6lA9ewhm9nShhcj2--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120424181302.GB2358>