On Tue, 16 Apr 2019 20:38:33 +0200 Christian König wrote:
> Each importer can now provide an invalidate_mappings callback.
> 
> This allows the exporter to provide the mappings without the need to pin
> the backing store.
> 
> v2: don't try to invalidate mappings when the callback is NULL,
>     lock the reservation obj while using the attachments,
>     add helper to set the callback
> v3: move flag for invalidation support into the DMA-buf,
>     use new attach_info structure to set the callback
> v4: use importer_priv field instead of mangling exporter priv.
> v5: drop invalidation_supported flag
> 
> Signed-off-by: Christian König <christian.koe...@amd.com>
> ---
>  drivers/dma-buf/dma-buf.c | 37 +++++++++++++++++++++++++++++++++++++
>  include/linux/dma-buf.h   | 33 +++++++++++++++++++++++++++++++--
>  2 files changed, 68 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
> index 83c92bfd964c..a3738fab3927 100644
> --- a/drivers/dma-buf/dma-buf.c
> +++ b/drivers/dma-buf/dma-buf.c
> @@ -563,6 +563,8 @@ struct dma_buf_attachment *dma_buf_attach(const struct 
> dma_buf_attach_info *info
>  
>       attach->dev = info->dev;
>       attach->dmabuf = dmabuf;
> +     attach->importer_priv = info->importer_priv;
> +     attach->invalidate = info->invalidate;
>  
>       mutex_lock(&dmabuf->lock);
>  
> @@ -571,7 +573,9 @@ struct dma_buf_attachment *dma_buf_attach(const struct 
> dma_buf_attach_info *info
>               if (ret)
>                       goto err_attach;
>       }
> +     reservation_object_lock(dmabuf->resv, NULL);
>       list_add(&attach->node, &dmabuf->attachments);
> +     reservation_object_unlock(dmabuf->resv);
>  
OK, protection from resv lock is needed for attach.

>       mutex_unlock(&dmabuf->lock);
>  
The snippet in [PATCH 01/12] dma-buf: add dynamic caching of sg_table
is copied and pasted below:

@@ -573,6 +573,20 @@ struct dma_buf_attachment *dma_buf_attach(struct dma_buf 
*dmabuf,
        list_add(&attach->node, &dmabuf->attachments);

        mutex_unlock(&dmabuf->lock);
+
+       if (!dmabuf->ops->dynamic_sgt_mapping) {
+               struct sg_table *sgt;
+
+               sgt = dmabuf->ops->map_dma_buf(attach, DMA_BIDIRECTIONAL);
+               if (!sgt)
+                       sgt = ERR_PTR(-ENOMEM);
+               if (IS_ERR(sgt)) {
+                       dma_buf_detach(dmabuf, attach);
+                       return ERR_CAST(sgt);
+               }
+               attach->sgt = sgt;

Looks like the protection mentioned is also needed in this case.
+       }
+
[...]
> +/**
> + * dma_buf_invalidate_mappings - invalidate all mappings of this dma_buf
> + *
> + * @dmabuf:  [in]    buffer which mappings should be invalidated
> + *
> + * Informs all attachmenst that they need to destroy and recreated all their

s/Informs/Inform/ s/attachmenst/attachments/ s/recreated/recreate/

> + * mappings.
> + */
> +void dma_buf_invalidate_mappings(struct dma_buf *dmabuf)
> +{
> +     struct dma_buf_attachment *attach;
> +
> +     reservation_object_assert_held(dmabuf->resv);
> +
> +     list_for_each_entry(attach, &dmabuf->attachments, node)
> +             if (attach->invalidate)
> +                     attach->invalidate(attach);
> +}
> +EXPORT_SYMBOL_GPL(dma_buf_invalidate_mappings);
> +
> 
BR
Hillf

_______________________________________________
amd-gfx mailing list
amd-...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to