diff mbox series

drm/ttm/nouveau: consolidate slowpath reserve

Message ID 20200728062402.21942-1-airlied@gmail.com (mailing list archive)
State New, archived
Headers show
Series drm/ttm/nouveau: consolidate slowpath reserve | expand

Commit Message

Dave Airlie July 28, 2020, 6:24 a.m. UTC
From: Dave Airlie <airlied@redhat.com>

The WARN_ON in the non-underscore path is off questionable value
(can we drop it from the non-slowpath?). At least for nouveau
where it's just looked up the gem object we know the ttm object
has a reference always so we can skip the check.

It's probably nouveau could use execbut utils here at some point
but for now align the code between them to always call the __
versions, and remove the non underscored version.

Signed-off-by: Dave Airlie <airlied@redhat.com>
---
 drivers/gpu/drm/nouveau/nouveau_gem.c  |  6 ++---
 drivers/gpu/drm/ttm/ttm_execbuf_util.c | 10 +--------
 include/drm/ttm/ttm_bo_driver.h        | 31 +++++++++++---------------
 3 files changed, 17 insertions(+), 30 deletions(-)

Comments

Christian König July 28, 2020, 7:29 a.m. UTC | #1
Am 28.07.20 um 08:24 schrieb Dave Airlie:
> From: Dave Airlie <airlied@redhat.com>
>
> The WARN_ON in the non-underscore path is off questionable value
> (can we drop it from the non-slowpath?). At least for nouveau
> where it's just looked up the gem object we know the ttm object
> has a reference always so we can skip the check.

Yeah, agreed. Wanted to look into removing that for quite some time as well.

> It's probably nouveau could use execbut utils here at some point
> but for now align the code between them to always call the __
> versions, and remove the non underscored version.

Can we do it the other way around and remove all uses of the __ versions 
of the functions instead and then merge the __ version into the normal 
one without the WARN_ON()?

Christian.

>
> Signed-off-by: Dave Airlie <airlied@redhat.com>
> ---
>   drivers/gpu/drm/nouveau/nouveau_gem.c  |  6 ++---
>   drivers/gpu/drm/ttm/ttm_execbuf_util.c | 10 +--------
>   include/drm/ttm/ttm_bo_driver.h        | 31 +++++++++++---------------
>   3 files changed, 17 insertions(+), 30 deletions(-)
>
> diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
> index 81f111ad3f4f..d2d535d2ece1 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_gem.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
> @@ -422,15 +422,15 @@ validate_init(struct nouveau_channel *chan, struct drm_file *file_priv,
>   			break;
>   		}
>   
> -		ret = ttm_bo_reserve(&nvbo->bo, true, false, &op->ticket);
> +		ret = __ttm_bo_reserve(&nvbo->bo, true, false, &op->ticket);
>   		if (ret) {
>   			list_splice_tail_init(&vram_list, &op->list);
>   			list_splice_tail_init(&gart_list, &op->list);
>   			list_splice_tail_init(&both_list, &op->list);
>   			validate_fini_no_ticket(op, chan, NULL, NULL);
>   			if (unlikely(ret == -EDEADLK)) {
> -				ret = ttm_bo_reserve_slowpath(&nvbo->bo, true,
> -							      &op->ticket);
> +				ret = __ttm_bo_reserve_slowpath(&nvbo->bo, true,
> +								&op->ticket);
>   				if (!ret)
>   					res_bo = nvbo;
>   			}
> diff --git a/drivers/gpu/drm/ttm/ttm_execbuf_util.c b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
> index 1797f04c0534..a24f13bc90fb 100644
> --- a/drivers/gpu/drm/ttm/ttm_execbuf_util.c
> +++ b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
> @@ -119,13 +119,7 @@ int ttm_eu_reserve_buffers(struct ww_acquire_ctx *ticket,
>   		ttm_eu_backoff_reservation_reverse(list, entry);
>   
>   		if (ret == -EDEADLK) {
> -			if (intr) {
> -				ret = dma_resv_lock_slow_interruptible(bo->base.resv,
> -										 ticket);
> -			} else {
> -				dma_resv_lock_slow(bo->base.resv, ticket);
> -				ret = 0;
> -			}
> +			ret = __ttm_bo_reserve_slowpath(bo, intr, ticket);
>   		}
>   
>   		if (!ret && entry->num_shared)
> @@ -133,8 +127,6 @@ int ttm_eu_reserve_buffers(struct ww_acquire_ctx *ticket,
>   								entry->num_shared);
>   
>   		if (unlikely(ret != 0)) {
> -			if (ret == -EINTR)
> -				ret = -ERESTARTSYS;
>   			if (ticket) {
>   				ww_acquire_done(ticket);
>   				ww_acquire_fini(ticket);
> diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
> index 5a37f1cc057e..563b970949a1 100644
> --- a/include/drm/ttm/ttm_bo_driver.h
> +++ b/include/drm/ttm/ttm_bo_driver.h
> @@ -695,7 +695,7 @@ static inline int ttm_bo_reserve(struct ttm_buffer_object *bo,
>   }
>   
>   /**
> - * ttm_bo_reserve_slowpath:
> + * __ttm_bo_reserve_slowpath:
>    * @bo: A pointer to a struct ttm_buffer_object.
>    * @interruptible: Sleep interruptible if waiting.
>    * @sequence: Set (@bo)->sequence to this value after lock
> @@ -704,24 +704,19 @@ static inline int ttm_bo_reserve(struct ttm_buffer_object *bo,
>    * from all our other reservations. Because there are no other reservations
>    * held by us, this function cannot deadlock any more.
>    */
> -static inline int ttm_bo_reserve_slowpath(struct ttm_buffer_object *bo,
> -					  bool interruptible,
> -					  struct ww_acquire_ctx *ticket)
> +static inline int __ttm_bo_reserve_slowpath(struct ttm_buffer_object *bo,
> +					    bool interruptible,
> +					    struct ww_acquire_ctx *ticket)
>   {
> -	int ret = 0;
> -
> -	WARN_ON(!kref_read(&bo->kref));
> -
> -	if (interruptible)
> -		ret = dma_resv_lock_slow_interruptible(bo->base.resv,
> -								 ticket);
> -	else
> -		dma_resv_lock_slow(bo->base.resv, ticket);
> -
> -	if (ret == -EINTR)
> -		ret = -ERESTARTSYS;
> -
> -	return ret;
> +	if (interruptible) {
> +		int ret = dma_resv_lock_slow_interruptible(bo->base.resv,
> +							   ticket);
> +		if (ret == -EINTR)
> +			ret = -ERESTARTSYS;
> +		return ret;
> +	}
> +	dma_resv_lock_slow(bo->base.resv, ticket);
> +	return 0;
>   }
>   
>   /**
Dave Airlie July 28, 2020, 7:58 a.m. UTC | #2
On Tue, 28 Jul 2020 at 17:30, Christian König <christian.koenig@amd.com> wrote:
>
> Am 28.07.20 um 08:24 schrieb Dave Airlie:
> > From: Dave Airlie <airlied@redhat.com>
> >
> > The WARN_ON in the non-underscore path is off questionable value
> > (can we drop it from the non-slowpath?). At least for nouveau
> > where it's just looked up the gem object we know the ttm object
> > has a reference always so we can skip the check.
>
> Yeah, agreed. Wanted to look into removing that for quite some time as well.
>
> > It's probably nouveau could use execbut utils here at some point
> > but for now align the code between them to always call the __
> > versions, and remove the non underscored version.
>
> Can we do it the other way around and remove all uses of the __ versions
> of the functions instead and then merge the __ version into the normal
> one without the WARN_ON()?

Yes sounds like a plan, I just wasn't sure the WARN_ON had value, bit
since you agree is dubious at best, I'm happy to rip it out.

Will send a v2 tomorrow.

Dave.
diff mbox series

Patch

diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
index 81f111ad3f4f..d2d535d2ece1 100644
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
@@ -422,15 +422,15 @@  validate_init(struct nouveau_channel *chan, struct drm_file *file_priv,
 			break;
 		}
 
-		ret = ttm_bo_reserve(&nvbo->bo, true, false, &op->ticket);
+		ret = __ttm_bo_reserve(&nvbo->bo, true, false, &op->ticket);
 		if (ret) {
 			list_splice_tail_init(&vram_list, &op->list);
 			list_splice_tail_init(&gart_list, &op->list);
 			list_splice_tail_init(&both_list, &op->list);
 			validate_fini_no_ticket(op, chan, NULL, NULL);
 			if (unlikely(ret == -EDEADLK)) {
-				ret = ttm_bo_reserve_slowpath(&nvbo->bo, true,
-							      &op->ticket);
+				ret = __ttm_bo_reserve_slowpath(&nvbo->bo, true,
+								&op->ticket);
 				if (!ret)
 					res_bo = nvbo;
 			}
diff --git a/drivers/gpu/drm/ttm/ttm_execbuf_util.c b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
index 1797f04c0534..a24f13bc90fb 100644
--- a/drivers/gpu/drm/ttm/ttm_execbuf_util.c
+++ b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
@@ -119,13 +119,7 @@  int ttm_eu_reserve_buffers(struct ww_acquire_ctx *ticket,
 		ttm_eu_backoff_reservation_reverse(list, entry);
 
 		if (ret == -EDEADLK) {
-			if (intr) {
-				ret = dma_resv_lock_slow_interruptible(bo->base.resv,
-										 ticket);
-			} else {
-				dma_resv_lock_slow(bo->base.resv, ticket);
-				ret = 0;
-			}
+			ret = __ttm_bo_reserve_slowpath(bo, intr, ticket);
 		}
 
 		if (!ret && entry->num_shared)
@@ -133,8 +127,6 @@  int ttm_eu_reserve_buffers(struct ww_acquire_ctx *ticket,
 								entry->num_shared);
 
 		if (unlikely(ret != 0)) {
-			if (ret == -EINTR)
-				ret = -ERESTARTSYS;
 			if (ticket) {
 				ww_acquire_done(ticket);
 				ww_acquire_fini(ticket);
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
index 5a37f1cc057e..563b970949a1 100644
--- a/include/drm/ttm/ttm_bo_driver.h
+++ b/include/drm/ttm/ttm_bo_driver.h
@@ -695,7 +695,7 @@  static inline int ttm_bo_reserve(struct ttm_buffer_object *bo,
 }
 
 /**
- * ttm_bo_reserve_slowpath:
+ * __ttm_bo_reserve_slowpath:
  * @bo: A pointer to a struct ttm_buffer_object.
  * @interruptible: Sleep interruptible if waiting.
  * @sequence: Set (@bo)->sequence to this value after lock
@@ -704,24 +704,19 @@  static inline int ttm_bo_reserve(struct ttm_buffer_object *bo,
  * from all our other reservations. Because there are no other reservations
  * held by us, this function cannot deadlock any more.
  */
-static inline int ttm_bo_reserve_slowpath(struct ttm_buffer_object *bo,
-					  bool interruptible,
-					  struct ww_acquire_ctx *ticket)
+static inline int __ttm_bo_reserve_slowpath(struct ttm_buffer_object *bo,
+					    bool interruptible,
+					    struct ww_acquire_ctx *ticket)
 {
-	int ret = 0;
-
-	WARN_ON(!kref_read(&bo->kref));
-
-	if (interruptible)
-		ret = dma_resv_lock_slow_interruptible(bo->base.resv,
-								 ticket);
-	else
-		dma_resv_lock_slow(bo->base.resv, ticket);
-
-	if (ret == -EINTR)
-		ret = -ERESTARTSYS;
-
-	return ret;
+	if (interruptible) {
+		int ret = dma_resv_lock_slow_interruptible(bo->base.resv,
+							   ticket);
+		if (ret == -EINTR)
+			ret = -ERESTARTSYS;
+		return ret;
+	}
+	dma_resv_lock_slow(bo->base.resv, ticket);
+	return 0;
 }
 
 /**