[PATCH] drm/ttm: enable eviction for Per-VM-BO

Thomas Hellstrom thomas at shipmail.org
Fri Dec 15 07:01:44 UTC 2017


Roger and Chrisitian,

Correct me if I'm wrong, but It seems to me like a lot of the recent 
changes to ttm_bo.c are to allow recursive reservation object locking in 
the case of shared reservation objects, but only in certain functions 
and with special arguments so it doesn't look like recursive locking to 
the lockdep checker.  Wouldn't it be a lot cleaner if we were to hide 
all this in a resurrected __ttm_bo_reserve something along the lines of

int __ttm_bo_reserve(struct ttm_bo *bo, struct ttm_operation_ctx *ctx) {
     if (ctx && ctx->resv == bo->resv) {
#ifdef CONFIG_LOCKDEP
         WARN_ON(bo->reserved);
lockdep_assert_held(&ctx->resv);
         ctx->reserve_count++;
bo->reserved = true;
#endif
         return0;
      } else {
         int ret = reservation_object_lock(bo->resv, NULL) ? 0:-EBUSY;

         if (ret)
             return ret;
#ifdef CONFIG_LOCKDEP
         WARN_ON(bo->reserved);
         bo->reserved = true;
#endif
         return 0;
}

And similar for tryreserve and unreserve? Perhaps with a ww_acquire_ctx 
included somewhere as well...

/Thomas




On 12/14/2017 09:10 AM, Roger He wrote:
> Change-Id: I0c6ece0decd18d30ccc94e5c7ca106d351941c62
> Signed-off-by: Roger He <Hongbo.He at amd.com>
> ---
>   drivers/gpu/drm/ttm/ttm_bo.c | 11 +++++------
>   1 file changed, 5 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
> index 098b22e..ba5b486 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> @@ -707,7 +707,6 @@ bool ttm_bo_eviction_valuable(struct ttm_buffer_object *bo,
>   EXPORT_SYMBOL(ttm_bo_eviction_valuable);
>   
>   static int ttm_mem_evict_first(struct ttm_bo_device *bdev,
> -			       struct reservation_object *resv,
>   			       uint32_t mem_type,
>   			       const struct ttm_place *place,
>   			       struct ttm_operation_ctx *ctx)
> @@ -722,8 +721,9 @@ static int ttm_mem_evict_first(struct ttm_bo_device *bdev,
>   	spin_lock(&glob->lru_lock);
>   	for (i = 0; i < TTM_MAX_BO_PRIORITY; ++i) {
>   		list_for_each_entry(bo, &man->lru[i], lru) {
> -			if (bo->resv == resv) {
> -				if (list_empty(&bo->ddestroy))
> +			if (bo->resv == ctx->resv) {
> +				if (!ctx->allow_reserved_eviction &&
> +				    list_empty(&bo->ddestroy))
>   					continue;
>   			} else {
>   				locked = reservation_object_trylock(bo->resv);
> @@ -835,7 +835,7 @@ static int ttm_bo_mem_force_space(struct ttm_buffer_object *bo,
>   			return ret;
>   		if (mem->mm_node)
>   			break;
> -		ret = ttm_mem_evict_first(bdev, bo->resv, mem_type, place, ctx);
> +		ret = ttm_mem_evict_first(bdev, mem_type, place, ctx);
>   		if (unlikely(ret != 0))
>   			return ret;
>   	} while (1);
> @@ -1332,8 +1332,7 @@ static int ttm_bo_force_list_clean(struct ttm_bo_device *bdev,
>   	for (i = 0; i < TTM_MAX_BO_PRIORITY; ++i) {
>   		while (!list_empty(&man->lru[i])) {
>   			spin_unlock(&glob->lru_lock);
> -			ret = ttm_mem_evict_first(bdev, NULL, mem_type,
> -						  NULL, &ctx);
> +			ret = ttm_mem_evict_first(bdev, mem_type, NULL, &ctx);
>   			if (ret)
>   				return ret;
>   			spin_lock(&glob->lru_lock);




More information about the dri-devel mailing list