Buffer Sharing and Synchronization
The dma-buf subsystem provides the framework for sharing buffers
for hardware (DMA) access across multiple device drivers and
subsystems, and for synchronizing asynchronous hardware access.
This is used, for example, by drm "prime" multi-GPU support, but
is of course not limited to GPU use cases.
The three main components of this are: (1) dma-buf, representing
a sg_table and exposed to userspace as a file descriptor to allow
passing between devices, (2) fence, which provides a mechanism
to signal when one device as finished access, and (3) reservation,
which manages the shared or exclusive fence(s) associated with
the buffer.
- dma_buf_export —
Creates a new dma_buf, and associates an anon file with this buffer, so it can be exported. Also connect the allocator specific data and ops to the buffer. Additionally, provide a name string for exporter; useful in debugging.
- dma_buf_fd —
returns a file descriptor for the given dma_buf
- dma_buf_get —
returns the dma_buf structure related to an fd
- dma_buf_put —
decreases refcount of the buffer
- dma_buf_attach —
Add the device to dma_buf's attachments list; optionally, calls
attach
of dma_buf_ops to allow device-specific attach functionality
- dma_buf_detach —
Remove the given attachment from dmabuf's attachments list; optionally calls
detach
of dma_buf_ops for device-specific detach
- dma_buf_map_attachment —
Returns the scatterlist table of the attachment; mapped into _device_ address space. Is a wrapper for
map_dma_buf
of the dma_buf_ops.
- dma_buf_unmap_attachment —
unmaps and decreases usecount of the buffer;might deallocate the scatterlist associated. Is a wrapper for
unmap_dma_buf
of dma_buf_ops.
- dma_buf_begin_cpu_access —
Must be called before accessing a dma_buf from the cpu in the kernel context. Calls begin_cpu_access to allow exporter-specific preparations. Coherency is only guaranteed in the specified range for the specified access direction.
- dma_buf_end_cpu_access —
Must be called after accessing a dma_buf from the cpu in the kernel context. Calls end_cpu_access to allow exporter-specific actions. Coherency is only guaranteed in the specified range for the specified access direction.
- dma_buf_kmap_atomic —
Map a page of the buffer object into kernel address space. The same restrictions as for kmap_atomic and friends apply.
- dma_buf_kunmap_atomic —
Unmap a page obtained by dma_buf_kmap_atomic.
- dma_buf_kmap —
Map a page of the buffer object into kernel address space. The same restrictions as for kmap and friends apply.
- dma_buf_kunmap —
Unmap a page obtained by dma_buf_kmap.
- dma_buf_mmap —
Setup up a userspace mmap with the given vma
- dma_buf_vmap —
Create virtual mapping for the buffer object into kernel address space. Same restrictions as for vmap and friends apply.
- dma_buf_vunmap —
Unmap a vmap obtained by dma_buf_vmap.
- struct dma_buf_ops —
operations possible on struct dma_buf
- struct dma_buf —
shared buffer object
- struct dma_buf_attachment —
holds device-buffer attachment data
- struct dma_buf_export_info —
holds information needed to export a dma_buf
- DEFINE_DMA_BUF_EXPORT_INFO —
- get_dma_buf —
convenience wrapper for get_file.
The reservation object provides a mechanism to manage shared and
exclusive fences associated with a buffer. A reservation object
can have attached one exclusive fence (normally associated with
write operations) or N shared fences (read operations). The RCU
mechanism is used to protect read access to fences from locked
write-side updates.