docs/75571: man page for sx(9) is misleading

John Baldwin jhb at FreeBSD.org
Wed Jan 5 21:07:43 UTC 2005


On Monday 03 January 2005 06:20 pm, Giorgos Keramidas wrote:
> The following reply was made to PR docs/75571; it has been noted by GNATS.
>
> From: Giorgos Keramidas <keramida at freebsd.org>
> To: John Baldwin <jhb at freebsd.org>
> Cc: bug-followup at freebsd.org
> Subject: Re: docs/75571: man page for sx(9) is misleading
> Date: Tue, 4 Jan 2005 01:11:36 +0200
>
>  On 2004-12-29 13:34, John Baldwin <jhb at freebsd.org> wrote:
>  >On Wednesday 29 December 2004 03:40 am, Giorgos Keramidas wrote:
>  >>On 2004-12-28 13:55, Darren Reed <darrenr at FreeBSD.ORG> wrote:
>  >>> According to discussion on freebsd mailing lists, it is not possible
>  >>> to hold an sx lock when you want a mtx lock.  This should be
>  >>> documented.
>  >>
>  >> As far as I can tell, by looking at kern_sx.c and sys/sx.h, this is
>  >> because the sx lock initialization uses an mtxpool for the mutex used
>  >> to serialize access to the internal sx lock data. [...]
>  >
>  > The reason is largely because they can be held across a sleep, e.g.:
>  >
>  > 	sx_xlock(&foo->sx);
>  > 	bar = malloc(sizeof(*bar), M_FOO, M_WAITOK);
>  > 	TAILQ_INSERT_TAIL(&foo->head, bar, link);
>  > 	sx_xunlock(&foo->sx);
>  >
>  > This is intentional and that is what should be documented.  Basically,
>  > it needs a paragraph to the effect of:
>  >
>  > .Pp
>  > An
>  > .Nm
>  > lock may not be acquired while holding a mutex.
>  > Since threads are allowed to sleep while holding an
>  > .NM
>  > lock,
>  > a thread that acquired a mutex and then blocked on an
>  > .Nm
>  > lock would end up sleeping while holding a mutex which is not allowed.
>
>  Nice :-)
>
>  Thanks for putting this in words.  Should I commit this?
>
>  %%%
>  Index: sx.9
>  ===================================================================
>  RCS file: /home/ncvs/src/share/man/man9/sx.9,v
>  retrieving revision 1.29
>  diff -u -5 -r1.29 sx.9
>  --- sx.9	11 Jul 2004 16:08:25 -0000	1.29
>  +++ sx.9	3 Jan 2005 23:08:40 -0000
>  @@ -194,10 +194,19 @@
>   attempting to do so will result in deadlock.
>   .Sh CONTEXT
>   A thread may hold a shared or exclusive lock on an
>   .Nm
>   lock while sleeping.
>  +As a result, an
>  +.Nm
>  +lock may not be acquired while holding a mutex.
>  +Since threads are allowed to sleep while holding an
>  +.Nm
>  +lock,
>  +a thread that acquired a mutex and then blocked on an
>  +.Nm
>  +lock would end up sleeping while holding a mutex which is not allowed.
>   .Sh SEE ALSO
>   .Xr condvar 9 ,
>   .Xr mtx_pool 9 ,
>   .Xr mutex 9 ,
>   .Xr panic 9 ,
>  %%%

Hmm, that's a good place to put that, here's a minor wording tweak:

As a result, an
.Nm
lock may not be acquired while holding a mutex.
Otherwise, if one thread slept while holding an
.Nm
lock while another thread blocked on the same
.Nm lock after acquiring a mutex,
then the second thread would effectively end up sleeping
while holding a mutex.

Eesh, any way you say it it ends up being a mouthful. :-P

-- 
John Baldwin <jhb at FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve"  =  http://www.FreeBSD.org



More information about the freebsd-doc mailing list