On Fri, Apr 26, 2019 at 02:36:29PM +0200, Christian König wrote:
To allow a smooth transition from pinning buffer objects to dynamic invalidation we first start to cache the sg_table for an attachment unless the driver has implemented the explicite pin/unpin callbacks.
Signed-off-by: Christian König christian.koenig@amd.com
btw given how huge a change this is the doc update is rather thin :-)
Probably better to revise this all together, so we have a coherent documentation story between static and dynamic dma-buf attachments and what exactly that means in each case.
drivers/dma-buf/dma-buf.c | 24 ++++++++++++++++++++++++ include/linux/dma-buf.h | 1 + 2 files changed, 25 insertions(+)
diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c index 0656dcf289be..a18d10c4425a 100644 --- a/drivers/dma-buf/dma-buf.c +++ b/drivers/dma-buf/dma-buf.c @@ -610,6 +610,20 @@ dma_buf_attach(const struct dma_buf_attach_info *info) list_add(&attach->node, &dmabuf->attachments);
mutex_unlock(&dmabuf->lock);
- if (!dmabuf->ops->pin) {
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;
- }
- return attach;
err_attach: @@ -632,6 +646,10 @@ void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach) if (WARN_ON(!dmabuf || !attach)) return;
- if (attach->sgt)
dmabuf->ops->unmap_dma_buf(attach, attach->sgt,
DMA_BIDIRECTIONAL);
- mutex_lock(&dmabuf->lock); list_del(&attach->node); if (dmabuf->ops->detach)
@@ -668,6 +686,9 @@ struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *attach, if (WARN_ON(!attach || !attach->dmabuf)) return ERR_PTR(-EINVAL);
- if (attach->sgt)
return attach->sgt;
- reservation_object_lock(attach->dmabuf->resv, NULL); r = dma_buf_pin(attach->dmabuf); reservation_object_unlock(attach->dmabuf->resv);
@@ -701,6 +722,9 @@ void dma_buf_unmap_attachment(struct dma_buf_attachment *attach, if (WARN_ON(!attach || !attach->dmabuf || !sg_table)) return;
- if (attach->sgt == sg_table)
return;
- attach->dmabuf->ops->unmap_dma_buf(attach, sg_table, direction);
diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h index 0321939b1c3d..b9d0719581cd 100644 --- a/include/linux/dma-buf.h +++ b/include/linux/dma-buf.h @@ -345,6 +345,7 @@ struct dma_buf_attachment { struct dma_buf *dmabuf; struct device *dev; struct list_head node;
- struct sg_table *sgt; void *priv;
};
-- 2.17.1
dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel