physio and vmapbuf

John Baldwin jhb at freebsd.org
Wed Mar 10 13:49:31 UTC 2010


On Wednesday 10 March 2010 6:40:18 am son goku wrote:
> Hi hackers,
> I have some experience with other UNIX kernels but none with FreeBSD.
> FreeBSD interests me for a potential project I might be involved in , and
> therefore I started researching it.
> Browsing through the I/O layer code, I stumbled upon something that looked
> strange, and perhaps you guys can help me with it.
> Mainly, when reading the physio path, when the I/O buffer is from user-mode,
> physio calls vmapbuf. The comments says that vmapbuf actually maps the
> user-buffer into kernel address space. From my experience, such mapping is
> needed only for very old devices that use PIO. Newer device just use DMA for
> data copy, and therefore don't need the mapping, instead they just need to
> pin the memory. Checking out vmapbuf only confused me further, I couldn't
> find where such kernel mapping was taken place, nevertheless I did saw that
> the buf->b_data was updated according to buf->b_saveaddr in some weird
> offset calculation.
> Adding to this confusion, there is a buf field called b_kvabase which
> supposedly stores the kernel virtual address which wasn't touched at all!!
> 
> Any help with understanding the flow and the usage of those fields/variables
> will be greatly appreciated!!

bus_dma (which drivers use to manage DMA), still uses virtual addressed 
buffers to build scatter/gather lists of physical addresses for DMA transfers.  
There has been much discussion and some prototype work to change this, but 
it's not a trivial project.  (I have converted physio to using bio's backed by 
sglist's with no kernel addresses in a prototype branch in p4 for example.)

-- 
John Baldwin


More information about the freebsd-hackers mailing list