Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 14 Mar 2007 05:29:26 +0100
From:      Pawel Jakub Dawidek <pjd@FreeBSD.org>
To:        Julian Elischer <julian@elischer.org>
Cc:        Robert Watson <rwatson@FreeBSD.org>, current@freebsd.org
Subject:   Re: [RFC] locking.9
Message-ID:  <20070314042926.GA6013@garage.freebsd.pl>
In-Reply-To: <45F771E2.9050709@elischer.org>
References:  <200703092241.l29Mf2Ds062856@repoman.freebsd.org> <200703121535.22140.jhb@freebsd.org> <20070312200345.GB5688@garage.freebsd.pl> <200703121618.41084.jhb@freebsd.org> <45F5E1F9.5090806@elischer.org> <20070313010309.Q25395@fledge.watson.org> <45F73AE7.6010508@elischer.org> <45F771E2.9050709@elischer.org>

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

--ibTvN161/egqYuK8
Content-Type: text/plain; charset=iso-8859-2
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Tue, Mar 13, 2007 at 08:54:10PM -0700, Julian Elischer wrote:
> Julian Elischer wrote:
>=20
> >ok so how about I commit this to get us started and the nroff and
> >locking experts can take it from there.
>=20
> The first table I think may look like this (from quick reading.. but I ma=
y be wrong):
>=20
>=20
>     The following table shows what you can and can not do if you hold one=
 of
>     the synchronisation primatives discussed here: (someone who knows what
>     they are talking about should write this table)

I think it should be:

>           You have:  You want: Spin_mtx  Slp_mtx sx_lock rw_lock sleep
>           SPIN mutex           ok        no      no      no      no-3
>           Sleep mutex          ok        ok-1    no      ok      no-3
>           sx_lock              ok        no      ??      no      ok-4
            sx_lock              ok        ok      ok-2    ok      ok
>           rw_lock              ok        no      no      ok-2    no-3
            rw_lock              ok        ok      no      ok-2    no

And I'd sort the table a bit differently: spin, mtx, rw, sx[, sleep].

>     *1 Recursion is defined per lock. lock order is important.

Lock order is always important, not only between the same lock types.
You also can't mix order of acquiring mtx and rw locks, etc.

>     *2 readers can recurse tough writers can not. lock order is important.

I think John or Attilio are working on adding a flag which will allow
for recursion.

>     *3 There are calls atomically release this primative when going to sl=
eep
>     and reacquire it on wakeup (e.g.  mtx_sleep(), rw-sleep() and
>     msleep_spin).()
>=20
>     *4 One can also use sx_sleep() which atomically release this primative
>     when going to sleep and reacquire it on wakeup.

What's the difference between 3 and 4? {rw,sx}_sleep(9) fucntions are
quite new and I don't know if you can use then only while
writer/exclusive lock or also while holding reader/shared lock.

BTW. I just wake up with a feeling that I did something wrong in my
code. I thought about it for a moment and it seems I'm right.
When one always use rw/sx locks this way:

	sx_xlock();
	/* do work */
	sx_downgrade();
	/* do work */
	sx_sunlock();

(the same for rw(9)) the lock will _never_ be shared, because one still
always acquire exclusive lock first, which serialize synchronization.
Is my thinking correct? If so, I think it's not very obvious, so we may
want to add a comment about such use to the manual page as well.

--=20
Pawel Jakub Dawidek                       http://www.wheel.pl
pjd@FreeBSD.org                           http://www.FreeBSD.org
FreeBSD committer                         Am I Evil? Yes, I Am!

--ibTvN161/egqYuK8
Content-Type: application/pgp-signature
Content-Disposition: inline

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

iD8DBQFF93omForvXbEpPzQRAgxjAJ9gw0ez5JupJhX0JxcFSp/UywlfyQCfTrqR
XBOJcq5ydkK7I4GB3HzPl9w=
=L4vQ
-----END PGP SIGNATURE-----

--ibTvN161/egqYuK8--



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