bus_dmamap_load_uio() and user data

John Baldwin jhb at freebsd.org
Fri Jan 8 16:13:34 UTC 2010


On Friday 08 January 2010 9:14:36 am Mark Tinguely wrote:
> >  You should use the pmap from the thread in the uio structure.  Similar to
> >  this from the x86 bus_dma code:
> >
> >          if (uio->uio_segflg == UIO_USERSPACE) {
> >                  KASSERT(uio->uio_td != NULL,
> >                          ("bus_dmamap_load_uio: USERSPACE but no proc"));
> >                  pmap = vmspace_pmap(uio->uio_td->td_proc->p_vmspace);
> >          } else
> >                  pmap = NULL;
> >
> >  Later when doing VA -> PA conversions the code does this:
> >
> >                          if (pmap)
> >                                  paddr = pmap_extract(pmap, vaddr);
> >                          else
> >                                  paddr = pmap_kextract(vaddr);
> >
> 
> We do that, but I notice that all the architecture that implement
> bounce buffers assume the VA is in the current map. Most of the
> addresses are KVA, but bus_dmamap_load_uio() can be in the user space.
> 
> I was wondering about the sequence:
> 
>  bus_dmamap_load_uio() user space
>    dma_load_buffer()
>      add bounce page save UVA (in caller user map)
> 
> later:
> 
>  bus_dma_sync
>    copies bounce buffer from saved UVA. <- here is my concern. The user pmap
> 	is not remembered use current pmap.
> 
> Since the bounce buffer copy routines have been running in other 
architectures
> for years without corruption, I was wondering we can safely assume that the
> dma sync is running in the same thread/address space as the 
bus_dmamap_load_uio
> call. I was hoping you would say, don't worry the scheduler would always
> reload the same thread to execute the dma sync code ...

Ahh.  I think bus_dmamap_load_uio() doesn't do deferred callbacks (i.e. 
mandates BUS_DMA_NOWAIT), and probably is always invoked from curthread.  Even 
in the case of aio, the thread's vmspace is the effective one at the time 
bus_dmamap_load_uio() would be invoked, so in practice it is safe.

-- 
John Baldwin


More information about the freebsd-hackers mailing list