All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Zanoni, Paulo R" <paulo.r.zanoni@intel.com>
To: "dri-devel@lists.freedesktop.org"
	<dri-devel@lists.freedesktop.org>,
	"Vishwanathapura,
	Niranjana" <niranjana.vishwanathapura@intel.com>,
	"intel-gfx@lists.freedesktop.org"
	<intel-gfx@lists.freedesktop.org>
Cc: "Brost, Matthew" <matthew.brost@intel.com>,
	"andi.shyti@linux.intel.com" <andi.shyti@linux.intel.com>,
	"Ursulin,  Tvrtko" <tvrtko.ursulin@intel.com>,
	"Nikula, Jani" <jani.nikula@intel.com>,
	"Landwerlin, Lionel G" <lionel.g.landwerlin@intel.com>,
	"Hellstrom, Thomas" <thomas.hellstrom@intel.com>,
	"Auld, Matthew" <matthew.auld@intel.com>,
	"jason@jlekstrand.net" <jason@jlekstrand.net>,
	"Vetter, Daniel" <daniel.vetter@intel.com>,
	"christian.koenig@amd.com" <christian.koenig@amd.com>
Subject: Re: [PATCH v6 20/20] drm/i915/vm_bind: Async vm_unbind support
Date: Tue, 8 Nov 2022 01:39:34 +0000	[thread overview]
Message-ID: <9b2538aa6ba2421e603c820af94c5d90df760501.camel@intel.com> (raw)
In-Reply-To: <20221107085210.17221-21-niranjana.vishwanathapura@intel.com>

On Mon, 2022-11-07 at 00:52 -0800, Niranjana Vishwanathapura wrote:
> Asynchronously unbind the vma upon vm_unbind call.
> Fall back to synchronous unbind if backend doesn't support
> async unbind or if async unbind fails.
> 
> No need for vm_unbind out fence support as i915 will internally
> handle all sequencing and user need not try to sequence any
> operation with the unbind completion.

Can you please provide some more details on how this works from the
user space point of view? I want to be able to know with 100% certainty
if an unbind has already happened, so I can reuse that vma or whatever
else I may decide to do. I see the interface does not provide any sort
of drm_syncobjs for me to wait on the async unbind. So, when does the
unbind really happen? When can I be sure it's past so I can do stuff
with it? Why would you provide an async ioctl and provide no means for
user space to wait on it?

Thanks,
Paulo

> 
> Signed-off-by: Niranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>
> ---
>  drivers/gpu/drm/i915/i915_vma.c | 51 ++++++++++++++++++++++++++++++---
>  drivers/gpu/drm/i915/i915_vma.h |  1 +
>  2 files changed, 48 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
> index 08218e3a2f12..03c966fad87b 100644
> --- a/drivers/gpu/drm/i915/i915_vma.c
> +++ b/drivers/gpu/drm/i915/i915_vma.c
> @@ -42,6 +42,8 @@
>  #include "i915_vma.h"
>  #include "i915_vma_resource.h"
>  
> 
> 
> 
> +static struct dma_fence *__i915_vma_unbind_async(struct i915_vma *vma);
> +
>  static inline void assert_vma_held_evict(const struct i915_vma *vma)
>  {
>  	/*
> @@ -1711,7 +1713,7 @@ void i915_vma_reopen(struct i915_vma *vma)
>  	spin_unlock_irq(&gt->closed_lock);
>  }
>  
> 
> 
> 
> -static void force_unbind(struct i915_vma *vma)
> +static void force_unbind(struct i915_vma *vma, bool async)
>  {
>  	if (!drm_mm_node_allocated(&vma->node))
>  		return;
> @@ -1725,7 +1727,21 @@ static void force_unbind(struct i915_vma *vma)
>  		i915_vma_set_purged(vma);
>  
> 
> 
> 
>  	atomic_and(~I915_VMA_PIN_MASK, &vma->flags);
> -	WARN_ON(__i915_vma_unbind(vma));
> +	if (async) {
> +		struct dma_fence *fence;
> +
> +		fence = __i915_vma_unbind_async(vma);
> +		if (IS_ERR_OR_NULL(fence)) {
> +			async = false;
> +		} else {
> +			dma_resv_add_fence(vma->obj->base.resv, fence,
> +					   DMA_RESV_USAGE_READ);
> +			dma_fence_put(fence);
> +		}
> +	}
> +
> +	if (!async)
> +		WARN_ON(__i915_vma_unbind(vma));
>  	GEM_BUG_ON(drm_mm_node_allocated(&vma->node));
>  }
>  
> 
> 
> 
> @@ -1785,7 +1801,7 @@ void i915_vma_destroy_locked(struct i915_vma *vma)
>  {
>  	lockdep_assert_held(&vma->vm->mutex);
>  
> 
> 
> 
> -	force_unbind(vma);
> +	force_unbind(vma, false);
>  	list_del_init(&vma->vm_link);
>  	release_references(vma, vma->vm->gt, false);
>  }
> @@ -1796,7 +1812,34 @@ void i915_vma_destroy(struct i915_vma *vma)
>  	bool vm_ddestroy;
>  
> 
> 
> 
>  	mutex_lock(&vma->vm->mutex);
> -	force_unbind(vma);
> +	force_unbind(vma, false);
> +	list_del_init(&vma->vm_link);
> +	vm_ddestroy = vma->vm_ddestroy;
> +	vma->vm_ddestroy = false;
> +
> +	/* vma->vm may be freed when releasing vma->vm->mutex. */
> +	gt = vma->vm->gt;
> +	mutex_unlock(&vma->vm->mutex);
> +	release_references(vma, gt, vm_ddestroy);
> +}
> +
> +void i915_vma_destroy_async(struct i915_vma *vma)
> +{
> +	bool vm_ddestroy, async = vma->obj->mm.rsgt;
> +	struct intel_gt *gt;
> +
> +	if (dma_resv_reserve_fences(vma->obj->base.resv, 1))
> +		async = false;
> +
> +	mutex_lock(&vma->vm->mutex);
> +	/*
> +	 * Ensure any asynchronous binding is complete while using
> +	 * async unbind as we will be releasing the vma here.
> +	 */
> +	if (async && i915_active_wait(&vma->active))
> +		async = false;
> +
> +	force_unbind(vma, async);
>  	list_del_init(&vma->vm_link);
>  	vm_ddestroy = vma->vm_ddestroy;
>  	vma->vm_ddestroy = false;
> diff --git a/drivers/gpu/drm/i915/i915_vma.h b/drivers/gpu/drm/i915/i915_vma.h
> index 737ef310d046..25f15965dab8 100644
> --- a/drivers/gpu/drm/i915/i915_vma.h
> +++ b/drivers/gpu/drm/i915/i915_vma.h
> @@ -272,6 +272,7 @@ void i915_vma_reopen(struct i915_vma *vma);
>  
> 
> 
> 
>  void i915_vma_destroy_locked(struct i915_vma *vma);
>  void i915_vma_destroy(struct i915_vma *vma);
> +void i915_vma_destroy_async(struct i915_vma *vma);
>  
> 
> 
> 
>  #define assert_vma_held(vma) dma_resv_assert_held((vma)->obj->base.resv)
>  
> 
> 
> 


WARNING: multiple messages have this Message-ID (diff)
From: "Zanoni, Paulo R" <paulo.r.zanoni@intel.com>
To: "dri-devel@lists.freedesktop.org"
	<dri-devel@lists.freedesktop.org>,
	"Vishwanathapura,
	Niranjana" <niranjana.vishwanathapura@intel.com>,
	"intel-gfx@lists.freedesktop.org"
	<intel-gfx@lists.freedesktop.org>
Cc: "Nikula, Jani" <jani.nikula@intel.com>,
	"Hellstrom, Thomas" <thomas.hellstrom@intel.com>,
	"Auld, Matthew" <matthew.auld@intel.com>,
	"Vetter, Daniel" <daniel.vetter@intel.com>,
	"christian.koenig@amd.com" <christian.koenig@amd.com>
Subject: Re: [Intel-gfx] [PATCH v6 20/20] drm/i915/vm_bind: Async vm_unbind support
Date: Tue, 8 Nov 2022 01:39:34 +0000	[thread overview]
Message-ID: <9b2538aa6ba2421e603c820af94c5d90df760501.camel@intel.com> (raw)
In-Reply-To: <20221107085210.17221-21-niranjana.vishwanathapura@intel.com>

On Mon, 2022-11-07 at 00:52 -0800, Niranjana Vishwanathapura wrote:
> Asynchronously unbind the vma upon vm_unbind call.
> Fall back to synchronous unbind if backend doesn't support
> async unbind or if async unbind fails.
> 
> No need for vm_unbind out fence support as i915 will internally
> handle all sequencing and user need not try to sequence any
> operation with the unbind completion.

Can you please provide some more details on how this works from the
user space point of view? I want to be able to know with 100% certainty
if an unbind has already happened, so I can reuse that vma or whatever
else I may decide to do. I see the interface does not provide any sort
of drm_syncobjs for me to wait on the async unbind. So, when does the
unbind really happen? When can I be sure it's past so I can do stuff
with it? Why would you provide an async ioctl and provide no means for
user space to wait on it?

Thanks,
Paulo

> 
> Signed-off-by: Niranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>
> ---
>  drivers/gpu/drm/i915/i915_vma.c | 51 ++++++++++++++++++++++++++++++---
>  drivers/gpu/drm/i915/i915_vma.h |  1 +
>  2 files changed, 48 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
> index 08218e3a2f12..03c966fad87b 100644
> --- a/drivers/gpu/drm/i915/i915_vma.c
> +++ b/drivers/gpu/drm/i915/i915_vma.c
> @@ -42,6 +42,8 @@
>  #include "i915_vma.h"
>  #include "i915_vma_resource.h"
>  
> 
> 
> 
> +static struct dma_fence *__i915_vma_unbind_async(struct i915_vma *vma);
> +
>  static inline void assert_vma_held_evict(const struct i915_vma *vma)
>  {
>  	/*
> @@ -1711,7 +1713,7 @@ void i915_vma_reopen(struct i915_vma *vma)
>  	spin_unlock_irq(&gt->closed_lock);
>  }
>  
> 
> 
> 
> -static void force_unbind(struct i915_vma *vma)
> +static void force_unbind(struct i915_vma *vma, bool async)
>  {
>  	if (!drm_mm_node_allocated(&vma->node))
>  		return;
> @@ -1725,7 +1727,21 @@ static void force_unbind(struct i915_vma *vma)
>  		i915_vma_set_purged(vma);
>  
> 
> 
> 
>  	atomic_and(~I915_VMA_PIN_MASK, &vma->flags);
> -	WARN_ON(__i915_vma_unbind(vma));
> +	if (async) {
> +		struct dma_fence *fence;
> +
> +		fence = __i915_vma_unbind_async(vma);
> +		if (IS_ERR_OR_NULL(fence)) {
> +			async = false;
> +		} else {
> +			dma_resv_add_fence(vma->obj->base.resv, fence,
> +					   DMA_RESV_USAGE_READ);
> +			dma_fence_put(fence);
> +		}
> +	}
> +
> +	if (!async)
> +		WARN_ON(__i915_vma_unbind(vma));
>  	GEM_BUG_ON(drm_mm_node_allocated(&vma->node));
>  }
>  
> 
> 
> 
> @@ -1785,7 +1801,7 @@ void i915_vma_destroy_locked(struct i915_vma *vma)
>  {
>  	lockdep_assert_held(&vma->vm->mutex);
>  
> 
> 
> 
> -	force_unbind(vma);
> +	force_unbind(vma, false);
>  	list_del_init(&vma->vm_link);
>  	release_references(vma, vma->vm->gt, false);
>  }
> @@ -1796,7 +1812,34 @@ void i915_vma_destroy(struct i915_vma *vma)
>  	bool vm_ddestroy;
>  
> 
> 
> 
>  	mutex_lock(&vma->vm->mutex);
> -	force_unbind(vma);
> +	force_unbind(vma, false);
> +	list_del_init(&vma->vm_link);
> +	vm_ddestroy = vma->vm_ddestroy;
> +	vma->vm_ddestroy = false;
> +
> +	/* vma->vm may be freed when releasing vma->vm->mutex. */
> +	gt = vma->vm->gt;
> +	mutex_unlock(&vma->vm->mutex);
> +	release_references(vma, gt, vm_ddestroy);
> +}
> +
> +void i915_vma_destroy_async(struct i915_vma *vma)
> +{
> +	bool vm_ddestroy, async = vma->obj->mm.rsgt;
> +	struct intel_gt *gt;
> +
> +	if (dma_resv_reserve_fences(vma->obj->base.resv, 1))
> +		async = false;
> +
> +	mutex_lock(&vma->vm->mutex);
> +	/*
> +	 * Ensure any asynchronous binding is complete while using
> +	 * async unbind as we will be releasing the vma here.
> +	 */
> +	if (async && i915_active_wait(&vma->active))
> +		async = false;
> +
> +	force_unbind(vma, async);
>  	list_del_init(&vma->vm_link);
>  	vm_ddestroy = vma->vm_ddestroy;
>  	vma->vm_ddestroy = false;
> diff --git a/drivers/gpu/drm/i915/i915_vma.h b/drivers/gpu/drm/i915/i915_vma.h
> index 737ef310d046..25f15965dab8 100644
> --- a/drivers/gpu/drm/i915/i915_vma.h
> +++ b/drivers/gpu/drm/i915/i915_vma.h
> @@ -272,6 +272,7 @@ void i915_vma_reopen(struct i915_vma *vma);
>  
> 
> 
> 
>  void i915_vma_destroy_locked(struct i915_vma *vma);
>  void i915_vma_destroy(struct i915_vma *vma);
> +void i915_vma_destroy_async(struct i915_vma *vma);
>  
> 
> 
> 
>  #define assert_vma_held(vma) dma_resv_assert_held((vma)->obj->base.resv)
>  
> 
> 
> 


  reply	other threads:[~2022-11-08  1:39 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-07  8:51 [PATCH v6 00/20] drm/i915/vm_bind: Add VM_BIND functionality Niranjana Vishwanathapura
2022-11-07  8:51 ` [Intel-gfx] " Niranjana Vishwanathapura
2022-11-07  8:51 ` [Intel-gfx] [PATCH v6 01/20] drm/i915/vm_bind: Expose vm lookup function Niranjana Vishwanathapura
2022-11-07  8:51   ` Niranjana Vishwanathapura
2022-11-07  8:51 ` [Intel-gfx] [PATCH v6 02/20] drm/i915/vm_bind: Add __i915_sw_fence_await_reservation() Niranjana Vishwanathapura
2022-11-07  8:51   ` Niranjana Vishwanathapura
2022-11-07  8:51 ` [PATCH v6 03/20] drm/i915/vm_bind: Expose i915_gem_object_max_page_size() Niranjana Vishwanathapura
2022-11-07  8:51   ` [Intel-gfx] " Niranjana Vishwanathapura
2022-11-07  8:51 ` [Intel-gfx] [PATCH v6 04/20] drm/i915/vm_bind: Add support to create persistent vma Niranjana Vishwanathapura
2022-11-07  8:51   ` Niranjana Vishwanathapura
2022-11-07  8:51 ` [Intel-gfx] [PATCH v6 05/20] drm/i915/vm_bind: Implement bind and unbind of object Niranjana Vishwanathapura
2022-11-07  8:51   ` Niranjana Vishwanathapura
2022-11-10  1:28   ` Zanoni, Paulo R
2022-11-10  1:28     ` [Intel-gfx] " Zanoni, Paulo R
2022-11-10 16:32     ` Niranjana Vishwanathapura
2022-11-10 16:32       ` [Intel-gfx] " Niranjana Vishwanathapura
2022-11-10 21:21       ` Zanoni, Paulo R
2022-11-10 21:21         ` [Intel-gfx] " Zanoni, Paulo R
2022-11-07  8:51 ` [Intel-gfx] [PATCH v6 06/20] drm/i915/vm_bind: Support for VM private BOs Niranjana Vishwanathapura
2022-11-07  8:51   ` Niranjana Vishwanathapura
2022-11-07  8:51 ` [Intel-gfx] [PATCH v6 07/20] drm/i915/vm_bind: Add support to handle object evictions Niranjana Vishwanathapura
2022-11-07  8:51   ` Niranjana Vishwanathapura
2022-11-07  8:51 ` [Intel-gfx] [PATCH v6 08/20] drm/i915/vm_bind: Support persistent vma activeness tracking Niranjana Vishwanathapura
2022-11-07  8:51   ` Niranjana Vishwanathapura
2022-11-07  8:51 ` [Intel-gfx] [PATCH v6 09/20] drm/i915/vm_bind: Add out fence support Niranjana Vishwanathapura
2022-11-07  8:51   ` Niranjana Vishwanathapura
2022-11-07  8:52 ` [PATCH v6 10/20] drm/i915/vm_bind: Abstract out common execbuf functions Niranjana Vishwanathapura
2022-11-07  8:52   ` [Intel-gfx] " Niranjana Vishwanathapura
2022-11-07  8:52 ` [PATCH v6 11/20] drm/i915/vm_bind: Use common execbuf functions in execbuf path Niranjana Vishwanathapura
2022-11-07  8:52   ` [Intel-gfx] " Niranjana Vishwanathapura
2022-11-07  8:52 ` [PATCH v6 12/20] drm/i915/vm_bind: Implement I915_GEM_EXECBUFFER3 ioctl Niranjana Vishwanathapura
2022-11-07  8:52   ` [Intel-gfx] " Niranjana Vishwanathapura
2022-11-07  8:52 ` [PATCH v6 13/20] drm/i915/vm_bind: Update i915_vma_verify_bind_complete() Niranjana Vishwanathapura
2022-11-07  8:52   ` [Intel-gfx] " Niranjana Vishwanathapura
2022-11-07  8:52 ` [Intel-gfx] [PATCH v6 14/20] drm/i915/vm_bind: Expose i915_request_await_bind() Niranjana Vishwanathapura
2022-11-07  8:52   ` Niranjana Vishwanathapura
2022-11-07  8:52 ` [PATCH v6 15/20] drm/i915/vm_bind: Handle persistent vmas in execbuf3 Niranjana Vishwanathapura
2022-11-07  8:52   ` [Intel-gfx] " Niranjana Vishwanathapura
2022-11-07  8:52 ` [PATCH v6 16/20] drm/i915/vm_bind: userptr dma-resv changes Niranjana Vishwanathapura
2022-11-07  8:52   ` [Intel-gfx] " Niranjana Vishwanathapura
2022-11-07  8:52 ` [Intel-gfx] [PATCH v6 17/20] drm/i915/vm_bind: Limit vm_bind mode to non-recoverable contexts Niranjana Vishwanathapura
2022-11-07  8:52   ` Niranjana Vishwanathapura
2022-11-07  8:52 ` [PATCH v6 18/20] drm/i915/vm_bind: Add uapi for user to enable vm_bind_mode Niranjana Vishwanathapura
2022-11-07  8:52   ` [Intel-gfx] " Niranjana Vishwanathapura
2022-11-07  8:52 ` [PATCH v6 19/20] drm/i915/vm_bind: Render VM_BIND documentation Niranjana Vishwanathapura
2022-11-07  8:52   ` [Intel-gfx] " Niranjana Vishwanathapura
2022-11-07  8:52 ` [PATCH v6 20/20] drm/i915/vm_bind: Async vm_unbind support Niranjana Vishwanathapura
2022-11-07  8:52   ` [Intel-gfx] " Niranjana Vishwanathapura
2022-11-08  1:39   ` Zanoni, Paulo R [this message]
2022-11-08  1:39     ` Zanoni, Paulo R
2022-11-08 15:46     ` Niranjana Vishwanathapura
2022-11-08 15:46       ` [Intel-gfx] " Niranjana Vishwanathapura
2022-11-09 17:52   ` Matthew Auld
2022-11-09 17:52     ` [Intel-gfx] " Matthew Auld
2022-11-09 20:11     ` Niranjana Vishwanathapura
2022-11-09 20:11       ` [Intel-gfx] " Niranjana Vishwanathapura
2022-11-09 21:13   ` Andi Shyti
2022-11-09 21:13     ` [Intel-gfx] " Andi Shyti
2022-11-10  0:28     ` Niranjana Vishwanathapura
2022-11-10  0:28       ` [Intel-gfx] " Niranjana Vishwanathapura
2022-11-07 11:21 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915/vm_bind: Add VM_BIND functionality (rev9) Patchwork
2022-11-07 11:21 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2022-11-07 11:40 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2022-11-07 14:13 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork
2022-11-10  0:16 ` [PATCH v6 00/20] drm/i915/vm_bind: Add VM_BIND functionality Zanoni, Paulo R
2022-11-10  0:16   ` [Intel-gfx] " Zanoni, Paulo R
2022-11-10  5:49   ` Niranjana Vishwanathapura
2022-11-10  5:49     ` [Intel-gfx] " Niranjana Vishwanathapura
2022-11-10 14:47     ` Tvrtko Ursulin
2022-11-10 15:05       ` Matthew Auld
2022-11-10 21:37         ` Zanoni, Paulo R

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=9b2538aa6ba2421e603c820af94c5d90df760501.camel@intel.com \
    --to=paulo.r.zanoni@intel.com \
    --cc=andi.shyti@linux.intel.com \
    --cc=christian.koenig@amd.com \
    --cc=daniel.vetter@intel.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=jani.nikula@intel.com \
    --cc=jason@jlekstrand.net \
    --cc=lionel.g.landwerlin@intel.com \
    --cc=matthew.auld@intel.com \
    --cc=matthew.brost@intel.com \
    --cc=niranjana.vishwanathapura@intel.com \
    --cc=thomas.hellstrom@intel.com \
    --cc=tvrtko.ursulin@intel.com \
    /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.