[PATCH] dma-buf: Document non-dynamic exporter expectations better
Christian König
ckoenig.leichtzumerken at gmail.com
Mon Jun 21 15:53:46 UTC 2021
Am 21.06.21 um 17:17 schrieb Daniel Vetter:
> Christian and me realized we have a pretty massive disconnect about
> different interpretations of what dma_resv is used for by different
> drivers. The discussion is much, much bigger than this change here,
> but this is an important one:
>
> Non-dynamic exporters must guarantee that the memory they return is
> ready for use. They cannot expect importers to wait for the exclusive
> fence. Only dynamic importers are required to obey the dma_resv fences
> strictly (and more patches are needed to define exactly what this
> means).
>
> Christian has patches to update nouvea, radeon and amdgpu. The only
> other driver using both ttm and supporting dma-buf export is qxl,
> which only uses synchronous ttm_bo_move.
>
> v2: To hammer this in document that dynamic importers _must_ wait for
> the exclusive fence after having called dma_buf_map_attachment.
>
> Cc: Christian König <ckoenig.leichtzumerken at gmail.com>
> Signed-off-by: Daniel Vetter <daniel.vetter at intel.com>
Reviewed-by: Christian König <christian.koenig at amd.com>
> ---
> drivers/dma-buf/dma-buf.c | 3 +++
> include/linux/dma-buf.h | 15 +++++++++++++++
> 2 files changed, 18 insertions(+)
>
> diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
> index e3ba5db5f292..65cbd7f0f16a 100644
> --- a/drivers/dma-buf/dma-buf.c
> +++ b/drivers/dma-buf/dma-buf.c
> @@ -956,6 +956,9 @@ EXPORT_SYMBOL_GPL(dma_buf_unpin);
> * the underlying backing storage is pinned for as long as a mapping exists,
> * therefore users/importers should not hold onto a mapping for undue amounts of
> * time.
> + *
> + * Important: Dynamic importers must wait for the exclusive fence of the struct
> + * dma_resv attached to the DMA-BUF first.
> */
> struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *attach,
> enum dma_data_direction direction)
> diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h
> index 342585bd6dff..92eec38a03aa 100644
> --- a/include/linux/dma-buf.h
> +++ b/include/linux/dma-buf.h
> @@ -96,6 +96,12 @@ struct dma_buf_ops {
> * This is called automatically for non-dynamic importers from
> * dma_buf_attach().
> *
> + * Note that similar to non-dynamic exporters in their @map_dma_buf
> + * callback the driver must guarantee that the memory is available for
> + * use and cleared of any old data by the time this function returns.
> + * Drivers which pipeline their buffer moves internally must wait for
> + * all moves and clears to complete.
> + *
> * Returns:
> *
> * 0 on success, negative error code on failure.
> @@ -144,6 +150,15 @@ struct dma_buf_ops {
> * This is always called with the dmabuf->resv object locked when
> * the dynamic_mapping flag is true.
> *
> + * Note that for non-dynamic exporters the driver must guarantee that
> + * that the memory is available for use and cleared of any old data by
> + * the time this function returns. Drivers which pipeline their buffer
> + * moves internally must wait for all moves and clears to complete.
> + * Dynamic exporters do not need to follow this rule: For non-dynamic
> + * importers the buffer is already pinned through @pin, which has the
> + * same requirements. Dynamic importers otoh are required to obey the
> + * dma_resv fences.
> + *
> * Returns:
> *
> * A &sg_table scatter list of or the backing storage of the DMA buffer,
More information about the dri-devel
mailing list