copyin()/copyout() constraints ?

Alfred Perlstein bright at
Fri Jun 14 22:00:06 UTC 2013

On 6/14/13 9:38 AM, Luigi Rizzo wrote:
> On Fri, Jun 14, 2013 at 12:07:29PM -0400, John Baldwin wrote:
>> On Wednesday, June 12, 2013 2:36:52 pm Alfred Perlstein wrote:
>>> On 6/12/13 11:01 AM, Luigi Rizzo wrote:
>>>> hi,
>>>> is it possible to run copyin() or copyout() in one of these cases:
>>>> 1. while holding a spinlock
>>>> 2. while holding a regular mutex/lock
>>>> 3. while holding a read lock (on an RWLOCK or RMLOCK)
>>>> 4. while holding a write lock (on an RWLOCK or RMLOCK)
>>>> I suspect #1 is forbidden, but am a bit unclear for the
>>>> other cases.
>>> No on all of the above unless the memory is wired.
> ok i suppose i'll move to an sx lock, which i have been told
> allows me to sleep ?
> My use case is that while i run the copyin(), and possibly take a
> page fault, nobody destroys the destination buffer.  So i wanted
> to hold a read lock (sx_slock() ?) in the thread doing the copy
> (there may be several writers to different parts of the destination),
> and a write lock (sx_xlock() ?) for the other thread which may
> destroy the buffer.

We may be putting cart before horse, or horse into cart or something. :)

You may want to just wire the user buffer so it can't get ripped out 
from under you.

See John's email which may be helpful to do that.

Alfred Perlstein
VP Software Engineering, iXsystems

More information about the freebsd-current mailing list