diff mbox series

dma-buf: Fix confusion of dynamic dma-buf vs dynamic attachment

Message ID 20210305105114.26338-1-chris@chris-wilson.co.uk (mailing list archive)
State New, archived
Headers show
Series dma-buf: Fix confusion of dynamic dma-buf vs dynamic attachment | expand

Commit Message

Chris Wilson March 5, 2021, 10:51 a.m. UTC
Commit c545781e1c55 ("dma-buf: doc polish for pin/unpin") disagrees with
the introduction of dynamism in commit: bb42df4662a4 ("dma-buf: add
dynamic DMA-buf handling v15") resulting in warning spew on
importing dma-buf. Silence the warning from the latter by only pinning
the attachment if the attachment rather than the dmabuf is to be
dynamic.

Fixes: bb42df4662a4 ("dma-buf: add dynamic DMA-buf handling v15")
Fixes: c545781e1c55 ("dma-buf: doc polish for pin/unpin")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Christian König <christian.koenig@amd.com>
Cc: <stable@vger.kernel.org> # v5.7+
---
 drivers/dma-buf/dma-buf.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

Comments

Christian König March 5, 2021, 10:54 a.m. UTC | #1
Am 05.03.21 um 11:51 schrieb Chris Wilson:
> Commit c545781e1c55 ("dma-buf: doc polish for pin/unpin") disagrees with
> the introduction of dynamism in commit: bb42df4662a4 ("dma-buf: add
> dynamic DMA-buf handling v15") resulting in warning spew on
> importing dma-buf. Silence the warning from the latter by only pinning
> the attachment if the attachment rather than the dmabuf is to be
> dynamic.

NAK, this is intentionally like this. You need to pin the DMA-buf if it 
is dynamic and the attachment isn't.

Otherwise the DMA-buf would be able to move even when it has an 
attachment which can't handle that.

We should rather fix the documentation if that is wrong on this point.

Regards,
Christian.

>
> Fixes: bb42df4662a4 ("dma-buf: add dynamic DMA-buf handling v15")
> Fixes: c545781e1c55 ("dma-buf: doc polish for pin/unpin")
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> Cc: Christian König <christian.koenig@amd.com>
> Cc: <stable@vger.kernel.org> # v5.7+
> ---
>   drivers/dma-buf/dma-buf.c | 9 +++++----
>   1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
> index f264b70c383e..09f5ae458515 100644
> --- a/drivers/dma-buf/dma-buf.c
> +++ b/drivers/dma-buf/dma-buf.c
> @@ -758,8 +758,8 @@ dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev,
>   	    dma_buf_is_dynamic(dmabuf)) {
>   		struct sg_table *sgt;
>   
> -		if (dma_buf_is_dynamic(attach->dmabuf)) {
> -			dma_resv_lock(attach->dmabuf->resv, NULL);
> +		if (dma_buf_attachment_is_dynamic(attach)) {
> +			dma_resv_lock(dmabuf->resv, NULL);
>   			ret = dma_buf_pin(attach);
>   			if (ret)
>   				goto err_unlock;
> @@ -772,8 +772,9 @@ dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev,
>   			ret = PTR_ERR(sgt);
>   			goto err_unpin;
>   		}
> -		if (dma_buf_is_dynamic(attach->dmabuf))
> -			dma_resv_unlock(attach->dmabuf->resv);
> +		if (dma_buf_attachment_is_dynamic(attach))
> +			dma_resv_unlock(dmabuf->resv);
> +
>   		attach->sgt = sgt;
>   		attach->dir = DMA_BIDIRECTIONAL;
>   	}
Daniel Vetter March 11, 2021, 2:12 p.m. UTC | #2
On Fri, Mar 05, 2021 at 11:54:49AM +0100, Christian König wrote:
> Am 05.03.21 um 11:51 schrieb Chris Wilson:
> > Commit c545781e1c55 ("dma-buf: doc polish for pin/unpin") disagrees with
> > the introduction of dynamism in commit: bb42df4662a4 ("dma-buf: add
> > dynamic DMA-buf handling v15") resulting in warning spew on
> > importing dma-buf. Silence the warning from the latter by only pinning
> > the attachment if the attachment rather than the dmabuf is to be
> > dynamic.
> 
> NAK, this is intentionally like this. You need to pin the DMA-buf if it is
> dynamic and the attachment isn't.
> 
> Otherwise the DMA-buf would be able to move even when it has an attachment
> which can't handle that.
> 
> We should rather fix the documentation if that is wrong on this point.

The doc is right, it's for the exporter function for importers. For
non-dynamic importers dma-buf.c code itself does ensure the pinning
happens. So non-dynamic importers really have no business calling
pin/unpin, because they always get a mapping that's put into system memory
and pinned there.

Ofc for driver specific stuff with direct interfaces you can do whatever
you feel like, but probably good to match these semantics.

But looking at the patch, I think this is more about the locking, not the
pin/unpin stuff. Locking rules definitely depend upon what the exporter
requires, and again dma-buf.c should do all the impendence mismatch that's
needed.

So I think we're all good with the doc, but please double-check.
-Daniel

> 
> Regards,
> Christian.
> 
> > 
> > Fixes: bb42df4662a4 ("dma-buf: add dynamic DMA-buf handling v15")
> > Fixes: c545781e1c55 ("dma-buf: doc polish for pin/unpin")
> > Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> > Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> > Cc: Christian König <christian.koenig@amd.com>
> > Cc: <stable@vger.kernel.org> # v5.7+
> > ---
> >   drivers/dma-buf/dma-buf.c | 9 +++++----
> >   1 file changed, 5 insertions(+), 4 deletions(-)
> > 
> > diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
> > index f264b70c383e..09f5ae458515 100644
> > --- a/drivers/dma-buf/dma-buf.c
> > +++ b/drivers/dma-buf/dma-buf.c
> > @@ -758,8 +758,8 @@ dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev,
> >   	    dma_buf_is_dynamic(dmabuf)) {
> >   		struct sg_table *sgt;
> > -		if (dma_buf_is_dynamic(attach->dmabuf)) {
> > -			dma_resv_lock(attach->dmabuf->resv, NULL);
> > +		if (dma_buf_attachment_is_dynamic(attach)) {
> > +			dma_resv_lock(dmabuf->resv, NULL);
> >   			ret = dma_buf_pin(attach);
> >   			if (ret)
> >   				goto err_unlock;
> > @@ -772,8 +772,9 @@ dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev,
> >   			ret = PTR_ERR(sgt);
> >   			goto err_unpin;
> >   		}
> > -		if (dma_buf_is_dynamic(attach->dmabuf))
> > -			dma_resv_unlock(attach->dmabuf->resv);
> > +		if (dma_buf_attachment_is_dynamic(attach))
> > +			dma_resv_unlock(dmabuf->resv);
> > +
> >   		attach->sgt = sgt;
> >   		attach->dir = DMA_BIDIRECTIONAL;
> >   	}
>
diff mbox series

Patch

diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
index f264b70c383e..09f5ae458515 100644
--- a/drivers/dma-buf/dma-buf.c
+++ b/drivers/dma-buf/dma-buf.c
@@ -758,8 +758,8 @@  dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev,
 	    dma_buf_is_dynamic(dmabuf)) {
 		struct sg_table *sgt;
 
-		if (dma_buf_is_dynamic(attach->dmabuf)) {
-			dma_resv_lock(attach->dmabuf->resv, NULL);
+		if (dma_buf_attachment_is_dynamic(attach)) {
+			dma_resv_lock(dmabuf->resv, NULL);
 			ret = dma_buf_pin(attach);
 			if (ret)
 				goto err_unlock;
@@ -772,8 +772,9 @@  dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev,
 			ret = PTR_ERR(sgt);
 			goto err_unpin;
 		}
-		if (dma_buf_is_dynamic(attach->dmabuf))
-			dma_resv_unlock(attach->dmabuf->resv);
+		if (dma_buf_attachment_is_dynamic(attach))
+			dma_resv_unlock(dmabuf->resv);
+
 		attach->sgt = sgt;
 		attach->dir = DMA_BIDIRECTIONAL;
 	}