All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Vetter <daniel@ffwll.ch>
To: "Christian König" <ckoenig.leichtzumerken@gmail.com>,
	sumit.semwal@linaro.org, linux-media@vger.kernel.org,
	dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org,
	linux-kernel@vger.kernel.org, amd-gfx@lists.freedesktop.org
Subject: Re: [PATCH 04/12] dma-buf: add optional invalidate_mappings callback v5
Date: Wed, 17 Apr 2019 16:33:20 +0200	[thread overview]
Message-ID: <20190417143320.GH13337@phenom.ffwll.local> (raw)
In-Reply-To: <20190417140116.GC13337@phenom.ffwll.local>

On Wed, Apr 17, 2019 at 04:01:16PM +0200, Daniel Vetter wrote:
> On Tue, Apr 16, 2019 at 08:38:33PM +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.koenig@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);
> >  
> >  	mutex_unlock(&dmabuf->lock);
> >  
> > @@ -615,7 +619,9 @@ void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach)
> >  					   DMA_BIDIRECTIONAL);
> >  
> >  	mutex_lock(&dmabuf->lock);
> > +	reservation_object_lock(dmabuf->resv, NULL);
> >  	list_del(&attach->node);
> > +	reservation_object_unlock(dmabuf->resv);
> >  	if (dmabuf->ops->detach)
> >  		dmabuf->ops->detach(dmabuf, attach);
> >  
> > @@ -653,7 +659,16 @@ dma_buf_map_attachment_locked(struct dma_buf_attachment *attach,
> >  	if (attach->sgt)
> >  		return attach->sgt;
> >  
> > +	/*
> > +	 * Mapping a DMA-buf can trigger its invalidation, prevent sending this
> > +	 * event to the caller by temporary removing this attachment from the
> > +	 * list.
> > +	 */
> > +	if (attach->invalidate)
> > +		list_del(&attach->node);
> >  	sg_table = attach->dmabuf->ops->map_dma_buf(attach, direction);
> > +	if (attach->invalidate)
> > +		list_add(&attach->node, &attach->dmabuf->attachments);
> >  	if (!sg_table)
> >  		sg_table = ERR_PTR(-ENOMEM);
> >  
> > @@ -751,6 +766,26 @@ void dma_buf_unmap_attachment(struct dma_buf_attachment *attach,
> >  }
> >  EXPORT_SYMBOL_GPL(dma_buf_unmap_attachment);
> >  
> > +/**
> > + * 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
> > + * 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);
> > +
> >  /**
> >   * DOC: cpu access
> >   *
> > @@ -1163,10 +1198,12 @@ static int dma_buf_debug_show(struct seq_file *s, void *unused)
> >  		seq_puts(s, "\tAttached Devices:\n");
> >  		attach_count = 0;
> >  
> > +		reservation_object_lock(buf_obj->resv, NULL);
> >  		list_for_each_entry(attach_obj, &buf_obj->attachments, node) {
> >  			seq_printf(s, "\t%s\n", dev_name(attach_obj->dev));
> >  			attach_count++;
> >  		}
> > +		reservation_object_unlock(buf_obj->resv);
> >  
> >  		seq_printf(s, "Total %d devices attached\n\n",
> >  				attach_count);
> > diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h
> > index 7e23758db3a4..ece4638359a8 100644
> > --- a/include/linux/dma-buf.h
> > +++ b/include/linux/dma-buf.h
> > @@ -324,6 +324,7 @@ struct dma_buf {
> >   * @dev: device attached to the buffer.
> >   * @node: list of dma_buf_attachment.
> >   * @priv: exporter specific attachment data.
> > + * @importer_priv: importer specific attachment data.
> >   *
> >   * This structure holds the attachment information between the dma_buf buffer
> >   * and its user device(s). The list contains one attachment struct per device
> > @@ -340,6 +341,29 @@ struct dma_buf_attachment {
> >  	struct list_head node;
> >  	void *priv;
> >  	struct sg_table *sgt;
> > +	void *importer_priv;
> > +
> > +	/**
> > +	 * @invalidate:
> > +	 *
> > +	 * Optional callback provided by the importer of the dma-buf.
> > +	 *
> > +	 * If provided the exporter can avoid pinning the backing store while
> > +	 * mappings exists.
> > +	 *
> > +	 * The function is called with the lock of the reservation object
> > +	 * associated with the dma_buf held and the mapping function must be
> > +	 * called with this lock held as well. This makes sure that no mapping
> > +	 * is created concurrently with an ongoing invalidation.
> > +	 *
> > +	 * After the callback all existing mappings are still valid until all
> > +	 * fences in the dma_bufs reservation object are signaled, but should be
> > +	 * destroyed by the importer as soon as possible.
> > +	 *
> > +	 * New mappings can be created immediately, but can't be used before the
> > +	 * exclusive fence in the dma_bufs reservation object is signaled.
> > +	 */
> > +	void (*invalidate)(struct dma_buf_attachment *attach);
> 
> I would put the long kerneldoc into dma_buf_attach_info (as an inline
> comment, you can mix the styles). And reference it from here with
> something like
> 
> "Set from &dma_buf_attach_info.invalidate in dma_buf_attach(), see there
> for more information."
> 
> This here feels a bit too much hidden.

Question on semantics: Is invalidate allowed to add new fences? I think we
need that for pipelined buffer moves and stuff perhaps (or pipeline
pagetable invalidates or whatever you feel like pipelining). And it should
be possible (we already hold the reservation lock), and I think ttm copes
(but no idea really).

Either way, docs need to be clear on this.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch

WARNING: multiple messages have this Message-ID (diff)
From: Daniel Vetter <daniel-/w4YWyX8dFk@public.gmane.org>
To: "Christian König"
	<ckoenig.leichtzumerken-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	sumit.semwal-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org,
	linux-media-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org,
	linaro-mm-sig-cunTk1MwBs8s++Sfvej+rw@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
Subject: Re: [PATCH 04/12] dma-buf: add optional invalidate_mappings callback v5
Date: Wed, 17 Apr 2019 16:33:20 +0200	[thread overview]
Message-ID: <20190417143320.GH13337@phenom.ffwll.local> (raw)
In-Reply-To: <20190417140116.GC13337-dv86pmgwkMBes7Z6vYuT8azUEOm+Xw19@public.gmane.org>

On Wed, Apr 17, 2019 at 04:01:16PM +0200, Daniel Vetter wrote:
> On Tue, Apr 16, 2019 at 08:38:33PM +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.koenig@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);
> >  
> >  	mutex_unlock(&dmabuf->lock);
> >  
> > @@ -615,7 +619,9 @@ void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach)
> >  					   DMA_BIDIRECTIONAL);
> >  
> >  	mutex_lock(&dmabuf->lock);
> > +	reservation_object_lock(dmabuf->resv, NULL);
> >  	list_del(&attach->node);
> > +	reservation_object_unlock(dmabuf->resv);
> >  	if (dmabuf->ops->detach)
> >  		dmabuf->ops->detach(dmabuf, attach);
> >  
> > @@ -653,7 +659,16 @@ dma_buf_map_attachment_locked(struct dma_buf_attachment *attach,
> >  	if (attach->sgt)
> >  		return attach->sgt;
> >  
> > +	/*
> > +	 * Mapping a DMA-buf can trigger its invalidation, prevent sending this
> > +	 * event to the caller by temporary removing this attachment from the
> > +	 * list.
> > +	 */
> > +	if (attach->invalidate)
> > +		list_del(&attach->node);
> >  	sg_table = attach->dmabuf->ops->map_dma_buf(attach, direction);
> > +	if (attach->invalidate)
> > +		list_add(&attach->node, &attach->dmabuf->attachments);
> >  	if (!sg_table)
> >  		sg_table = ERR_PTR(-ENOMEM);
> >  
> > @@ -751,6 +766,26 @@ void dma_buf_unmap_attachment(struct dma_buf_attachment *attach,
> >  }
> >  EXPORT_SYMBOL_GPL(dma_buf_unmap_attachment);
> >  
> > +/**
> > + * 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
> > + * 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);
> > +
> >  /**
> >   * DOC: cpu access
> >   *
> > @@ -1163,10 +1198,12 @@ static int dma_buf_debug_show(struct seq_file *s, void *unused)
> >  		seq_puts(s, "\tAttached Devices:\n");
> >  		attach_count = 0;
> >  
> > +		reservation_object_lock(buf_obj->resv, NULL);
> >  		list_for_each_entry(attach_obj, &buf_obj->attachments, node) {
> >  			seq_printf(s, "\t%s\n", dev_name(attach_obj->dev));
> >  			attach_count++;
> >  		}
> > +		reservation_object_unlock(buf_obj->resv);
> >  
> >  		seq_printf(s, "Total %d devices attached\n\n",
> >  				attach_count);
> > diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h
> > index 7e23758db3a4..ece4638359a8 100644
> > --- a/include/linux/dma-buf.h
> > +++ b/include/linux/dma-buf.h
> > @@ -324,6 +324,7 @@ struct dma_buf {
> >   * @dev: device attached to the buffer.
> >   * @node: list of dma_buf_attachment.
> >   * @priv: exporter specific attachment data.
> > + * @importer_priv: importer specific attachment data.
> >   *
> >   * This structure holds the attachment information between the dma_buf buffer
> >   * and its user device(s). The list contains one attachment struct per device
> > @@ -340,6 +341,29 @@ struct dma_buf_attachment {
> >  	struct list_head node;
> >  	void *priv;
> >  	struct sg_table *sgt;
> > +	void *importer_priv;
> > +
> > +	/**
> > +	 * @invalidate:
> > +	 *
> > +	 * Optional callback provided by the importer of the dma-buf.
> > +	 *
> > +	 * If provided the exporter can avoid pinning the backing store while
> > +	 * mappings exists.
> > +	 *
> > +	 * The function is called with the lock of the reservation object
> > +	 * associated with the dma_buf held and the mapping function must be
> > +	 * called with this lock held as well. This makes sure that no mapping
> > +	 * is created concurrently with an ongoing invalidation.
> > +	 *
> > +	 * After the callback all existing mappings are still valid until all
> > +	 * fences in the dma_bufs reservation object are signaled, but should be
> > +	 * destroyed by the importer as soon as possible.
> > +	 *
> > +	 * New mappings can be created immediately, but can't be used before the
> > +	 * exclusive fence in the dma_bufs reservation object is signaled.
> > +	 */
> > +	void (*invalidate)(struct dma_buf_attachment *attach);
> 
> I would put the long kerneldoc into dma_buf_attach_info (as an inline
> comment, you can mix the styles). And reference it from here with
> something like
> 
> "Set from &dma_buf_attach_info.invalidate in dma_buf_attach(), see there
> for more information."
> 
> This here feels a bit too much hidden.

Question on semantics: Is invalidate allowed to add new fences? I think we
need that for pipelined buffer moves and stuff perhaps (or pipeline
pagetable invalidates or whatever you feel like pipelining). And it should
be possible (we already hold the reservation lock), and I think ttm copes
(but no idea really).

Either way, docs need to be clear on this.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

  reply	other threads:[~2019-04-17 14:33 UTC|newest]

Thread overview: 70+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-16 18:38 dynamic DMA-buf sharing between devices Christian König
2019-04-16 18:38 ` Christian König
2019-04-16 18:38 ` [PATCH 01/12] dma-buf: add dynamic caching of sg_table Christian König
2019-04-16 18:38 ` [PATCH 02/12] dma-buf: add dma_buf_(un)map_attachment_locked variants v3 Christian König
2019-05-27 10:56   ` Christian König
2019-04-16 18:38 ` [PATCH 03/12] dma-buf: lock the reservation object during (un)map_dma_buf v3 Christian König
2019-04-16 18:38   ` Christian König
2019-04-17 14:08   ` Daniel Vetter
2019-04-17 14:08     ` Daniel Vetter
2019-04-17 14:14     ` Christian König
2019-04-17 14:26       ` Daniel Vetter
2019-04-17 14:26         ` Daniel Vetter
2019-04-17 17:10         ` Christian König
2019-04-17 17:10           ` Christian König
2019-04-16 18:38 ` [PATCH 04/12] dma-buf: add optional invalidate_mappings callback v5 Christian König
2019-04-16 18:38   ` Christian König
2019-04-17 14:01   ` Daniel Vetter
2019-04-17 14:01     ` Daniel Vetter
2019-04-17 14:33     ` Daniel Vetter [this message]
2019-04-17 14:33       ` Daniel Vetter
2019-04-17 19:07   ` Daniel Vetter
2019-04-17 19:07     ` Daniel Vetter
2019-04-17 19:13     ` Christian König
2019-04-17 19:13       ` Christian König
2019-04-18  8:08       ` Daniel Vetter
2019-04-18  8:28         ` Koenig, Christian
2019-04-18  8:28           ` Koenig, Christian
2019-04-18  8:40           ` Daniel Vetter
2019-04-18  8:40             ` Daniel Vetter
2019-04-16 18:38 ` [PATCH 05/12] dma-buf: add explicit buffer pinning Christian König
2019-04-16 18:38   ` Christian König
2019-04-17 14:20   ` Daniel Vetter
2019-04-17 14:20     ` Daniel Vetter
2019-04-17 14:30     ` Daniel Vetter
2019-04-17 14:30       ` Daniel Vetter
2019-04-17 14:40       ` Daniel Vetter
2019-04-17 19:05         ` Daniel Vetter
2019-04-19 19:05   ` Alex Deucher
2019-04-19 19:05     ` Alex Deucher
2019-04-16 18:38 ` [PATCH 06/12] drm: remove prime sg_table caching Christian König
2019-04-16 18:38   ` Christian König
2019-04-16 18:38 ` [PATCH 07/12] drm/ttm: remove the backing store if no placement is given Christian König
2019-04-16 18:38   ` Christian König
2019-04-16 18:38 ` [PATCH 08/12] drm/ttm: use the parent resv for ghost objects Christian König
2019-04-16 18:38   ` Christian König
2019-04-16 18:38 ` [PATCH 09/12] drm/amdgpu: add independent DMA-buf export v3 Christian König
2019-04-16 18:38 ` [PATCH 10/12] drm/amdgpu: add independent DMA-buf import v4 Christian König
2019-04-16 18:38 ` [PATCH 11/12] drm/amdgpu: add DMA-buf pin/unpin implementation Christian König
2019-04-16 18:38   ` Christian König
2019-04-16 18:38 ` [PATCH 12/12] drm/amdgpu: add DMA-buf invalidation callback v2 Christian König
2019-04-16 18:38   ` Christian König
2019-04-17 13:52 ` dynamic DMA-buf sharing between devices Chunming Zhou
2019-04-17 13:52   ` Chunming Zhou
2019-04-17 13:59   ` Christian König
2019-04-17 14:14     ` Chunming Zhou
2019-04-18  9:13 ` Daniel Vetter
2019-04-18 10:57   ` Christian König
2019-04-18 10:57     ` Christian König
2019-04-27  0:01 ` [PATCH 01/12] dma-buf: add dynamic caching of sg_table Liam Mark
2019-05-22 16:17   ` Sumit Semwal
2019-05-22 17:27     ` Christian König
2019-05-22 17:27       ` Christian König
2019-05-22 18:30       ` Daniel Vetter
2019-05-22 18:30         ` Daniel Vetter
2019-05-23 11:21         ` Koenig, Christian
2019-05-23 11:21           ` Koenig, Christian
2019-05-23 11:30           ` Daniel Vetter
2019-05-23 11:30             ` Daniel Vetter
2019-05-23 11:32             ` Daniel Vetter
2019-05-23 11:32               ` Daniel Vetter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190417143320.GH13337@phenom.ffwll.local \
    --to=daniel@ffwll.ch \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=ckoenig.leichtzumerken@gmail.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=linaro-mm-sig@lists.linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=sumit.semwal@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.