[PATCH] drm/ttm/nouveau: consolidate slowpath reserve

Christian König christian.koenig at amd.com
Tue Jul 28 07:29:56 UTC 2020


Am 28.07.20 um 08:24 schrieb Dave Airlie:
> From: Dave Airlie <airlied at 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 at 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;
>   }
>   
>   /**



More information about the dri-devel mailing list