copyin()/copyout() constraints ?

Konstantin Belousov kostikbel at
Sat Jun 15 11:31:37 UTC 2013

On Sat, Jun 15, 2013 at 01:26:10PM +0200, Luigi Rizzo wrote:
> With "indirect buffers" in netmap/vale, i can eliminate the A->B copy,
> and do A->C with a copyin in the kernel of the host.
> But the per-packet budget is minuscule, and i am afraid that doing
> an unconditional vslock() on each buffer is going to be too expensive
> (and then i should also unwire the page ?

Using vslock() causes enormous user map fragmentation and should be
avoided. The cost is basically the same as the page fault, since
vslock() is a wrapper around vm_map_wire(), which just calls page fault
handler for each address in region.

On the other hand, I do not understand how any kernel-side lock would
prevent usermode from unmapping a buffer while other thread in kernel
mode access it.

IMO you would be much better served with either with proc_rwmem(), as
discussed before, or direct use of vm_fault_quick_hold_pages() and
uiomove_fromphys() afterward. vm_fault_quick_hold_pages() also makes you
code immune against usermode doing any unmap or mapping over the passed
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 834 bytes
Desc: not available
URL: <>

More information about the freebsd-current mailing list