Date: Mon, 11 Jan 2010 21:22:42 +0100 From: Max Laier <max@love2party.net> To: freebsd-hackers@freebsd.org Cc: "H.Fazaeli" <fazaeli@sepehrs.com> Subject: Re: uiomove and mutex Message-ID: <201001112122.43000.max@love2party.net> In-Reply-To: <4B4B7A7F.2090808@sepehrs.com> References: <4B4B7A7F.2090808@sepehrs.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Monday 11 January 2010 20:22:39 H.Fazaeli wrote: > dear gurus > > man mutex(9) states that: > > "No mutexes should be held (except for Giant) across functions which > access memory in userspace, such as copyin(9), copyout(9), uiomove(9), > fuword(9), etc. No locks are needed when calling these functions." > > can someone pls. explain why it is so? Any memory access to user memory (unless the memory has been wired down before) can result in a swap in from secondary storage, which - in turn - results in a sleep. Most locks are not allowed to be held over a sleep. See locking(9) for details. > Suppose I have a kernel buffer to which kernel writes and > userland processes read via a character device. In the device > read method, If we unlock the mutex just before uiomove, is it > guaranteed that kernel does not write to the buffer in the middle > of uiomove? If yes, how? What is the solution in such a situation? > rwlocks? an intermediate buffer? sx(9) is one possibility. The other way is to use a pointer or state that you modify while holding the mutex: Thread1: lock(&mtx); buffer_in_use=1; unlock(&mtx); uiomove() lock(&mtx); buffer_in_use=0; wakeup(&buffer_in_use); unlock(&mtx); Thread2: lock(&mtx); while(buffer_in_use) mlseep(&buffer_in_use, &mtx, ...) do_stuff_to_the_buffer(); unlock(&mtx); -- Max
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201001112122.43000.max>