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@xxxxxxx> Correction on my "squash everything" suggestion: I think this patch here still needs to be separate, so that "why did this cause a regression" is easier to understand. But with a small nit. > --- > 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) { I think a static inline dma_buf_is_dynamic_attachment() would be good here, which in this patch (since it's ealier) would always return false. Aside: I think only checking pin here (i.e. can the exporter do dynamic mappings) isn't good enough, we also need to check for the importers ->invalidate. Hence _is_dynamic_attachment, not _is_dynamic_dma_buf. If we don't also check for the importer we again have a reservation lock in dma_buf_map/unmap, which we know will anger the lockdep gods ... -Daniel > + 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@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel