uiomove and mutex
Max Laier
max at love2party.net
Mon Jan 11 20:22:45 UTC 2010
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
More information about the freebsd-hackers
mailing list